📓 探索.

📌二分探索木-探索の特徴.

  • 木の高さをhとすると、計算量O(h)のアルゴリズムとなる.

📌二分探索木-探索の手順.

1️⃣根を起点としてfindを呼び出し、根から葉に向かって節点を探索.
2️⃣節点xより与えられたキーが小さい場合は左の子、それ以外の場合は右の子へ移動して探索.
3️⃣キーが存在しない場合はNILを返す.

Node * find(Node *u, int k) {
    while (u != NIL && k != u->key) {
        // 現在調べている節点uのキーより与えられたキーkが小さい場合は左要素へ移動
        if (k < u->key) {
            u = u->left;
        // それ以外の場合は右要素へ移動し探索
        } else {
            u = u->right;
        }
    }
    return u;
}

二分探索木を作るアルゴリズム.

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iostream>

using namespace std;

struct Node {
    int key;
    Node *right, *left, *parent;
};

Node *root, *NIL;

void insert(int k) {
    // 省略
}

void inorder(Node *u) {
    // 省略
}

void preorder(Node *u) {
    // 省略
}

int main(int argc, char** argv) {
    
    int n, i, x;
    string com;
    
    scanf("%d", &n);
    
    for (i = 0; i < n; i++) {
        cin >> com;
        if (com[0] == 'f') {
            scanf("%d", &x);
            // 根を起点にfind呼び出し.
            Node *t = find(root, x);
            if (t != NIL) {
                printf("yes\n");
            } else {
                printf("no\n");
            }
        } else if (com == "insert") {
            scanf("%d", &x);
            insert(x);
        } else if (com == "print") {
            inorder(root);
            printf("\n");
            preorder(root);
            printf("\n");
        }
    }
    return 0;
}

🔎対象ソースは以下に格納.

/source/7.binary/search.cpp