二分探索ツリーノードの検索(Java サンプルコード)

目次

 

二分探索ツリー ノードの検索

Java サンプルコード

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 個の要素を検索します。

 

ee6f95c549935c28b9fa470a543f4a7d.png

(1)要素 43 はルート ノード 42 より大きいため、右側の子ノードで比較を続行する必要があります。

 

a41a37a56ab04144ffae2e68c7528753.png

(2)要素 43 は 59 より小さいため、左側の子ノードで比較を続行する必要があります。

 

3409a5751812ecb1be27287e7108b2cd.png

(3)要素 43 は 51 より小さいため、左側の子ノードで比較を続ける必要があります。

 

66b3f3a1c679f37b7e50cbada6fe9fd3.png

(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 );
    }
}

 

おすすめ

転載: blog.csdn.net/2301_78835635/article/details/132296541