
コンピュータサイエンスにおいて、二分探索木(BST)は、順序付き二分木またはソート済み二分木とも呼ばれ、各内部ノードのキーがそのノードの左部分木内のすべてのキーよりも大きく、右部分木内のすべてのキーよりも小さい、根付き二分木データ構造です。二分探索木に対する操作の時間計算量は、木の高さに対して線形です。
二分探索木は、データの高速な検索、追加、削除を可能にする二分探索を可能にします。二分探索木のノードは、各比較で残りの木の約半分をスキップするように配置されているため、検索性能は二進対数に比例します。二分探索木は、ラベル付きデータの効率的な保存という問題のために1960年代に考案され、コンウェイ・バーナーズ=リーとデビッド・ウィーラーに帰属します。
二分探索木のパフォーマンスは、ノードを木に挿入する順序に依存します。任意の挿入は縮退を引き起こす可能性があるためです。二分探索木には、最悪の場合のパフォーマンスが保証されるいくつかのバリエーションがあります。基本的な操作には、検索、走査、挿入、削除があります。最悪の場合の複雑さが保証された二分探索木は、線形検索時間を必要とするソートされていない配列よりも優れたパフォーマンスを発揮します。
BSTの複雑性分析によると、平均して挿入、削除、検索には時間がかかります。のためにノード。最悪の場合、単方向連結リストに劣化する。任意の挿入と削除による木の高さの際限のない増加に対処するため、最悪の検索複雑度を二進対数に制限する自己平衡二分探索木の変種が導入された。AVL木は、1962 年にGeorgy Adelson-VelskyとEvgenii Landisによって発明された最初の自己平衡二分探索木である。[ 1 ] [ 2 ] [ 3 ]
二分探索木は、動的セット、ルックアップテーブル、優先度キューなどの抽象データ型を実装するために使用でき、ツリーソートなどのソートアルゴリズムにも使用できます。
二分探索木アルゴリズムは、PF ウィンドリー、アンドリュー ドナルド ブース、アンドリュー コリン、トーマス N. ヒバードなど、複数の研究者によって独立して発見されました。[ 4 ] [ 5 ]このアルゴリズムは、 1960 年に磁気テープにラベル付きデータを格納するために使用したコンウェイ バーナーズ=リーとデビッド ウィーラーに帰属します。 [ 6 ]最も初期の人気のある二分探索木アルゴリズムの 1 つは、ヒバードのものです。[ 4 ]
二分探索木の時間計算量は、ノードが任意の順序で挿入される場合、木の高さとともに際限なく増加するため、木の高さを制限するために自己平衡二分探索木が導入されました。[ 7 ]木の高さを制限するために、 AVL木、Treaps、赤黒木など、さまざまな高さバランスの取れた二分探索木が導入されました。[ 8 ]
二分探索木は、根付き二分木であり、ノードは厳密な全順序で配置され、特定のノードAよりも大きいキーを持つノードはノードAの右部分木に格納され、 A以下のキーを持つノードはAの左部分木に格納され、二分探索特性を満たす。[ 9 ] : 298 [ 10 ] : 287
二分探索木は、ソートや検索アルゴリズムにも有効です。ただし、二分探索木の探索複雑度は、ノードの挿入と削除の順序に依存します。最悪の場合、二分探索木での連続操作は縮退を引き起こし、単方向連結リスト(または「不均衡な木」)のような構造を形成する可能性があるため、連結リストと同じ最悪の場合の複雑度になります。[ 11 ] [ 9 ] : 299-302
二分探索木は、集合、多重集合、連想配列などの抽象データ構造の構築に使用される基本的なデータ構造でもあります。
二分探索木で特定のキーを検索する処理は、再帰的または反復的にプログラムすることができます。
検索はルートノードの調査から始まります。ツリーがnilの場合、検索対象のキーはツリー内に存在しません。それ以外の場合、キーがルートのキーと等しい場合は、検索は成功し、ノードが返されます。キーがルートのキーより小さい場合は、左サブツリーの調査に進みます。同様に、キーがルートのキーより大きい場合は、右サブツリーの調査に進みます。このプロセスは、キーが見つかるか、残りのサブツリーが空になるまで繰り返されます。検索したキーが見つからない場合部分木に到達した場合、そのキーは木の中に存在しない。[ 10 ]: 290-291
以下の擬似コードは、再帰によってBST探索手順を実装する。[ 10 ] : 290
再帰的な手順は、または捜索対象に遭遇する。
再帰的な検索はwhileループに「展開」できる。ほとんどのマシンでは、反復的なバージョンの方が効率的であることがわかっている。[ 10 ]: 291
検索は葉ノードまで進む可能性があるため、BST検索の実行時間計算量はどこは木の高さです。ただし、BST検索の最悪のケースはどこBST のノードの総数は、不均衡な BST がリンク リストに退化する可能性があるためです。ただし、BST が高さ的に均衡している場合、高さは[ 10 ] : 290
特定の操作では、ノードが与えられた場合後継者または前任者を見つけるが重要です。BST のすべてのキーが互いに異なると仮定すると、ノードの後継ノードはBSTでは、最小のキーを持つノードは、のキー。一方、ノードの先行ノードはBSTでは、キーが小さいノードはのキー。以下の擬似コードは、ノードの後継ノードと前継ノードを見つけます。BSTにおいて。[ 12 ] [ 13 ] [ 10 ]: 292-293
二分探索木(BST)において、キーが最大値または最小値であるノードを見つけるといった操作は、ノードの後継ノードや先行ノードを決定するなどの特定の操作において重要である。以下に、これらの操作の擬似コードを示す。[ 10 ]: 291-292
挿入や削除などの操作によって、BST表現は動的に変化します。BSTの特性が維持されるようにデータ構造を変更する必要があります。新しいノードはBSTの葉ノードとして挿入されます。 [ 10 ] : 294–295以下は挿入操作の反復実装です。[ 10 ] : 294
この手順では「末尾ポインタ」が保持されます。親として2行目の初期化後、 4~11行目のwhileループによってポインタが更新されます。は、BSTは空なので、二分探索木のルートノードとして挿入されるもしそうでないなら挿入は、キーをキーと比較することによって行われます。15~19行目にノードを挿入する。[ 10 ]: 295

ノードの削除、例えば二分探索木から3つの事例がある:[ 10 ]: 295-297
以下の擬似コードは、二分探索木における削除操作を実装したものである。[ 10 ]: 296-298
のこの手順は、上記の 3 つの特殊ケースを処理します。2 ~ 3 行目はケース 1 を、4 ~ 5 行目はケース 2 を、6 ~ 16 行目はケース 3 を処理します。ヘルパー関数ノードを置き換える目的で削除アルゴリズム内で使用されると二分探索木において[ 10 ] : 298この手順では、削除(および置換)を処理します。から。
BSTは、中順、前順、後順の3つの基本的なアルゴリズムで走査できます。[ 10 ] : 287
以下に、ツリーウォークの再帰的な実装を示す。[ 10 ]: 287-289
再バランスを行わないと、二分探索木への挿入や削除によって退化が生じ、高さが木の(はツリー内のアイテム数)であるため、検索パフォーマンスは線形検索と同程度に低下します。[ 14 ]検索ツリーのバランスを保ち、高さを制限します。これは、二分探索木の有用性の鍵となる要素である。これは、木の更新操作中に、木の高さを二分対数複雑度に維持するように設計された「自己平衡」メカニズムによって実現できる。[ 7 ] [ 15 ]: 50
左部分木と右部分木の高さが一定の係数で関連付けられることが保証されている場合、その木は高さバランスが取れていると言えます。この特性はAVL木で導入され、赤黒木で引き継がれました。[ 15 ] : 50-51ルートから変更された葉ノードまでのパス上のすべてのノードの高さは、木への挿入および削除操作のたびに監視され、必要に応じて修正される必要があります。[ 15 ] : 52
重みバランスの取れた木では、バランスの取れた木の基準は部分木の葉の数です。左部分木と右部分木の重みの差は最大で[ 16 ] [ 15 ] : 61しかし、その差は比率によって制限される重みの強いバランス条件維持できない挿入および削除操作中の再バランス処理。-重みバランス木は、各左サブツリーと右サブツリーがそれぞれ少なくともサブツリーの総重量の。[ 15 ]: 62
自己平衡二分探索木には、T木[ 17 ] 、treap [ 18 ] 、赤黒木[ 19 ] 、B木[ 20 ] 、2-3木[ 21 ] 、およびSplay木[ 22 ]などがある。
二分探索木は、すべての要素が一度に挿入され、木が順序通りに走査されるツリーソートなどのソートアルゴリズムで使用されます。 [ 23 ] BSTはクイックソートでも使用されます。[ 24 ]
優先度キューの実装には二分探索木が使用され、ノードのキーが優先度として使用されます。キューへの新しい要素の追加は通常のBST挿入操作に従いますが、削除操作は優先度キューの種類によって異なります。[ 25 ]
セクション 6.2.3 の最後に定義されている 2〜3 ツリーは、次数 3 の B ツリーと同等です。