残りの二日間は、状態ビットを復元し、ポイントの基礎を追加します。
バイナリ検索ツリー
後継者(後継)、INSERTおよびDELETEにより、検索、最小値、最大値、先行(前駆体)を含む多くの動作動的セットをサポートするために、ツリーデータ構造を検索します。私たちは辞書としてだけでなく、プライオリティキューのいずれかとして探索木を使用しますので。そして、それは木の高さに木の比例を検索するのにかかる時間バイナリの基本動作。二分探索木は二つの重要な変異体、赤黒ツリーとBツリーを持って、我々はこの記事を修正する機会を持っています。
名前が示すように、二分探索木の構成は、バイナリツリーです。示されるように、このようなツリーデータ構造は、各ノードがオブジェクトでリンクされたリストとすることができます。キー外部接続点に加えて、各ノードは、特性がP、右を左に含ま。それぞれ左の子ノード、右の子とその親ノードポイントのため。ヌルのない場合は、対応するプロパティの値。親ルートノードへのポインタのみノードツリーがnullです。
約二分探索木はとてもいくつかの機能を持っています。任意のノードxについて、その左の部分木キーワードの最大値はx.key、右サブツリーがx.key以上であるキーワードの最小値を超えません。別のバイナリ検索ツリーは、同じ値のセットの集合を表すことができます。図に示すように。
予約限定!
このプロパティは、バイナリ検索ツリーは、シーケンス内のすべてのキーワードの単純な再帰的アルゴリズムによる(注文x.key)出力二分探索木に私たちをことができます。このようなアルゴリズムは、先行順(INORDERツリーウォーク)と呼ばれています。キーの値の間の左部分木と右のサブツリーのルートでのキーワードのように命名サブツリー出力の根本的な原因です。同様に、最初のトラバーサル、ルートキー後順出力前/左、右サブツリー後のキー値。擬似順トラバーサルアルゴリズムを次のように
INORDER-TREE- WALK(X) { もし(X!= NULL) { INORDER -TREE- WALK(x.left)。 印刷のx; INORDER -TREE- WALK(x.right)。 } }
2つのバイナリ検索ツリーの前の図では、彼ら行きがけのgetは、2,5,5,6,7,8と同じです。
二分探索木を照会
先に述べたように、バイナリ検索ツリーは、設定された操作の数をサポートしています。私たちは、これらの操作のバイナリ検索ツリーの完全なアイデアを使用して見てみましょう。
求めます
我々は、ノードがリターンを存在する場合は、ノードのキー値kを検索したい場合は、それ以外の場合はNULLを返します。あなたは見つけるために、以下の方法を使用することができます。
(X、k)の検索// xは、ツリーのルートを見つけるために行われるべきであり、kは、あなたが探しているキー値であります { もし(x == NULL || x.key == k)は { 戻り値は、x; } もし(K <x.key) { 検索(x.left、k)を返します。 } 他 { 検索(x.right、k)を返します。 } }
アイデアは、我々は、検索を続けるには、左または右のサブツリーサブツリーを使用することを決定しない場合は、現在のノードは、我々が探しているノードであるかどうかを判断する、非常に簡単です。ループはそれを書き換えるための方法である一方、しかし、それは仕方再帰の上にまだある、私達は使用することができます。コンピュータの場合、この方法の効率は高くする必要があります。
値検索(X、K)// xは木、kの同じルートでは、キーワードを探すことです { しばらく(X!= NULL && x.key!= K) { もし(K <x.key) { X = x.left。 } 他 { X = x.right。 } } 戻り値は、x; }
最大値と最小値
二分探索木の性質に起因する任意のノードXは、その左の部分木キーワードの最大値は、右の部分木が少ないx.key以下であるキーワードの最小値をx.keyを超えません。私たちは二分探索木種または最小操作の最大値を探していきましたように、常に右の対応/左側のサブ子まで、右/左の子を探しているがnullのように簡略化することができます。例えば最大値のために、このノードの値は、その親よりも劣ら見つけてはならない、と親ノードを順次ルートノードまで、その親未満であってはなりません。そして、左のサブツリー内の任意のノードで特定のルートノードよりも小さくありません。
後継者と前任
注文および前駆体の定義を見てみましょう。互いに異なるすべてのキーワードは、xは後続ノードがxよりも小さいキーも大きい場合は、トラバーサル順序の順にその後継者を見つけた場合、ノードのバイナリ検索ツリーを考えると.KEYノード言葉。同様に、ノードXは、以下x.Keyより最大キーの先行ノードです。バイナリ検索ツリー構造は、任意のキーワードを比較しないことにより、ノードの後継者を決定することができます。後継者が存在する場合、そのようなプロセスは、後続ノードXを返し、それ以外の場合はNULLを返すであろう。
SUCCESSOR(X) { もし(x.right!= nullの) { 返す TREE- 最小(x.rightを); //右部分木の最小値を見つけます。 } ここで、Yは= XPと、 しばらく(Y!= nullの && X == y.right) { X = Y。 Y = YP。 } リターンY; }
ここでは、例として、後続ノードのアイデアを見つけるために見て上記偉アルゴリズムの後継を探しています。方法それに類似の先行ノードを探しています。その後の定義は、それが特定の値x.key未満ではありません。ノードの右サブツリーxが存在する場合したがって、次に最小値は、xのx.Right後継者です。二分探索木の定義ので、この最小要件を満たす必要があります。xの右部分木が存在しない場合、我々は、x、xの祖先の後継者を見つける必要があります。(xの左サブツリーは、それが破棄され、一定の要件を満たしていません)。私たちは、最初のyのx、yは親を見つけ、xは、子または右の子を左の解釈があります。xが左の子である場合は、その親ノードは、x、yはxの後継者です。y.Key> = x.Keyので。xがyの値がXよりもまだ少ないであることを示す、右の子yのであれば、私たちは見ておく必要があります。それは、ルートノードに遭遇する、またはxの現在の繰り返しは、親ノードの左の子になるまで。
別のアルゴリズムはじめすなわち定理、ある高さhで、動的動作セット、最小値、最大値、およびその後探して前駆体を見つけるためにバイナリサーチツリーは、の時間O(h)に行うことができるが。これは、ここに掲載しませ証明しました。