二分探索木ノードの挿入

まず二分探索木を定義します。Java コードは以下の通りです:

public class BST<Key extends Comparable<Key>, Value> {

    // ツリー内のノードはプライベートクラスであり、外部は二分探索木ノードの具体的な実装を知る必要はありません
    private class Node {
        private Key key;
        private Value value;
        private Node left, right;

        public Node(Key key, Value value) {
            this.key = key;
            this.value = value;
            left = right = null;
        }
    }
    // ルートノード
    private Node root;
    // ツリー内のノード数
    private int count;
    // コンストラクタ。デフォルトで空の二分探索木を構築します
    public BST() {
        root = null;
        count = 0;
    }
    // 二分探索木のノード数を返す
    public int size() {
        return count;
    }
    // 二分探索木が空かどうかを返す
    public boolean isEmpty() {
        return count == 0;
    }
}

Node はノードを表し、count はノードの数を表します。

以下の例では、次の二分探索木に要素61を挿入する手順を示します:

(1)挿入する要素61は42より大きいので、42の右部分木のルートノードと比較します。

(2)61は59より大きいので、61を59の右部分木の該当位置に移動する必要があります。このとき空なので、そのまま59の右子ノードとして挿入します。

挿入操作も再帰的なプロセスであり、等しい、大きい、小さいの3つの場合に分けられます。

Java 実例コード

ソースコードパッケージのダウンロード:Download

src/サンプル/binary/BinarySearchTreeInsert.java のコード:

package サンプル.binary;

/**
* 二分探索木に新しい要素を挿入します
 */


public class BinarySearchTreeInsert<Key extends Comparable<Key>, Value> {

    // ツリー内のノードはプライベートクラスであり、外部は二分探索木ノードの具体的な実装を知る必要はありません
    private class Node {
        private Key key;
        private Value value;
        private Node left, right;

        public Node(Key key, Value value) {
            this.key = key;
            this.value = value;
            left = right = null;
        }
    }

    private Node root;  // ルートノード
    private int count;  // ツリー内のノード数

    // コンストラクタ。デフォルトで空の二分探索木を構築します
    public BinarySearchTreeInsert() {
        root = null;
        count = 0;
    }

    // 二分探索木のノード数を返す
    public int size() {
        return count;
    }

    // 二分探索木が空かどうかを返す
    public boolean isEmpty() {
        return count == 0;
    }

    // 二分探索木に新しい(key, value)データペアを挿入します
    public void insert(Key key, Value value) {
        root = insert(root, key, value);
    }

    //コアコード---開始
    // nodeをルートとする二分探索木に、ノード(key, value)を挿入します。再帰アルゴリズムを使用します
    // 新しいノードを挿入した後の二分探索木のルートを返す
    private Node insert(Node node, Key key, Value value) {
        if (node == null) {
            count++;
            return new Node(key, value);
        }
        if (key.compareTo(node.key) == 0)
            node.value = value;
        else if (key.compareTo(node.key) < 0)
            node.left = insert(node.left, key, value);
        else    // key > node->key
            node.right = insert(node.right, key, value);

        return node;
    }
    //コアコード---終了
}
その他の拡張