二分探索木ノードの挿入
まず二分探索木を定義します。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;
}
}
// ツリー内のノードはプライベートクラスであり、外部は二分探索木ノードの具体的な実装を知る必要はありません
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;
}
//コアコード---終了
}
/**
* 二分探索木に新しい要素を挿入します
*/
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;
}
//コアコード---終了
}