目次
src/runoob/binary/BinarySearchTreeSearch.java ファイル コード:
二分探索ツリー ノードの検索
二分探索木には添字がないため、二分探索木の検索操作については、二分探索木に特定の要素が含まれているかどうかを判定し、ブール変数を返すcontainメソッドがここで定義されています。この検索操作も再帰的です。具体的には、コードは次のように実装されます。
...
// 再帰アルゴリズムを使用して、ノードをルートとする二分探索木にキー値を持つノードが含まれるかどうかを確認します
private boolean contains(Node node, Key key){ if( node == null ) return false; if ( key.compareTo(node.key) == 0 ) return true; else if( key.compareTo(node.key) < 0 ) return contains(node.left , key ); else // key > node->key return contains (node.right , key ); } ...
次の例では、二分探索ツリーで 43 個の要素を検索します。
(1)要素 43 はルート ノード 42 より大きいため、右側の子ノードで比較を続行する必要があります。
(2)要素 43 は 59 より小さいため、左側の子ノードで比較を続行する必要があります。
(3)要素 43 は 51 より小さいため、左側の子ノードで比較を続ける必要があります。
(4)合計と正確に等しい、51 の左側の子ノード 43 を見つけて終了します。
キーに対応する値を見つける必要がある場合、コードは次のとおりです。
...
// ノードをルートとする二分探索ツリー内のキーに対応する値を検索します。再帰アルゴリズム
// 値が存在しない場合は、NULL を返します
private Value search(Node node, Key key){ if( node == null ) null を返します; if( key.compareTo(node.key) == 0 ) return node.value; else if( key.compareTo(node.key) < 0 ) return search(node.left , key ); else // キー > ノード->キー return search(node.right, key ); } ...
Java サンプルコード
ソース コード パッケージのダウンロード: https://www.runoob.com/wp-content/uploads/2020/09/runoob-algorithm-BinarySearchTreeSearch.zipをダウンロードします。
src/runoob/binary/BinarySearchTreeSearch.java ファイル コード:
package runoob.binary;
/**
* バイナリ検索ツリー検索
*/
public class BinarySearchTreeSearch<Key extends Comparable<Key>, Value> { // ツリー内のノードはプライベート クラスであり、外部の世界は二分探索ツリーノードの詳細 プライベートクラスの実装 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 BinarySearchTreeSearch() {
root = null;
count = 0;
}
// 二分探索木内のノードの数を返す
public int size() { return count; } // 二分探索木が空かどうかを返す public boolean isEmpty() { return count = = 0; } // 新しい (キー, 値) データ ペアをバイナリ検索ツリーに挿入します public void insert(Key key, Value value){ root = insert(root, key, value); } // バイナリが存在するかどうかを確認しますsearchtree キー key が存在します public boolean contains(Key key){ return contains(root, key); } // 二分探索木でキー key に対応する値を検索します。この値が存在しない場合は、null が返されます。 public Value search(Key key){ return search(root, key);
}
//**********************
//* 二分探索木の補助関数
//************** ** ****
// 再帰アルゴリズムを使用して、ノードをルートとして二分探索ツリーにノード (キー、値) を挿入します。 //
新しいノードを挿入した後、二分探索
ツリーのルートを返します。 private Node insert(Nodeノード、キー key 、値 value){ if( ノード == 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 // キー > ノード->キー node.right = insert( node.right, key 、値); ノードを返します。
}
// 再帰アルゴリズムを使用して、ノードをルートとする二分探索木にキー値を持つノードが含まれるかどうかを確認します
private boolean contains(Node node, Key key){ if( node == null ) return false; if( key .compareTo(node.key) == 0 ) return true; else if( key.compareTo(node.key) < 0 ) return contains(node.left , key ); else // key > node->key return contains( node .right , key ); } // ノードをルートとする二分探索ツリー内のキーに対応する値を検索する、再帰アルゴリズム // 値が存在しない場合は、NULL を返します private Value search(Node node, Key key){ if (node == null ) return null; if( key.compareTo(node.key) == 0 )
ノードの値を返します。
else if( key.compareTo(node.key) < 0 )
return search(node.left , key );
else // キー > ノード->キー
return search(node.right, key );
}
}