これらはバイナリ基本的な特性を満たすために必要とされる -ツリー内の任意のノードの値がその左の子と未満のその右の子よりも大きい、すなわち。このようなツリーの探索効率のこの基本的な性質に応じて大幅に改善されます。我々は、最悪の場合は、片面(だけ右/左の部分木)である二分木を生成する過程の不均衡に非常に容易であることを知って、これは必然的に検索効率につながる大幅バイナリツリーを維持するために二分木(O(N))を、低減されます:バランス、ダニエルのようなアルゴリズムの様々な実装、提案したAVL、SBT、スプレー木、Treap 、赤黒木ようにとします。
平衡二分木は、以下の特性を有していなければならない:それは左空のツリーまたはサブツリーであり、右の高さの差の絶対値を超えない 1と左右のサブツリー平衡二分木です。これは、バイナリツリーなどの任意の子ノードは、左右のサブツリーの高さは類似していたことを意味します。
両方のノードに到達するには、親子関係でなければなりません。 ルートノードから任意のノードへのパスが1つしかありません。 サブノード複数のは、唯一の親ノードを有しています。パスのすべての親ノードはユニークです。
いずれかのノードが一つだけのパスから上がって、一つだけの親を持っている、あなたは、このパス上の、それぞれの層だけで一つのノードに到達することができないではないノードへの経路上で、このパス上の他のノードに到達することができます。
バイナリ検索がより効率的に見つけるために、順次検索ではなく挿入するため、。
効率的にサポートするために挿入操作を、我々は必要なように見えるの連鎖構造を。
シングルリンクチェーンは、バイナリ検索を使用することができ、迅速によってインデックス付け任意サブアレイ得ることができるバイナリサーチからの効率的なように、中央要素。柔軟性バイナリ検索効率と一緒に一覧表示するには、我々は、より複雑なデータ構造にする必要があります。
同時に両方を持つことができるである二分探索木 BST 。
取引所は、左と、すべてのノードの右サブツリー:
パブリック クラスInvertBinaryTree { // ノードに切り替え、すべての 公共のTreeNode invertTree(ツリーノードルート){ IF(=ルート!NULL ){ ツリーノードT = root.left; // 交換ルート root.left = root.right; root.right = T。 invertTree(root.left); // 交換左サブツリー invertTree(root.right); // 右サブツリーが交換 戻りルートを; } そうでなければ{ 戻り NULL ; } } //层序遍历 公共のTreeNode invertTree_bfs(ツリーノードルート){ 場合(ルート== NULL ){ 戻り ヌル。 } 他{ キュー <ツリーノード>キュー= 新しい LinkedListの<ツリーノード> (); queue.offer(ルート)。 一方、(!queue.isEmpty()){ ツリーノードP = queue.poll()。 ツリーノードトン = p.left。 p.left = p.right。 p.right = T; もし(!p.left = NULL ){ queue.offer(p.left)。 } であれば(p.right!= NULL ){ queue.offer(p.right)。 } } 戻りルート。 } } }
パブリック クラスのTreeNode { 公共の int型のval; 公共のTreeNodeは左。 公共右のTreeNode。 公共のTreeNode(INT X){ ヴァル = X。 } 公共のTreeNode(int型のVal、ツリーノードは、左、右のツリーノード){ スーパー()。 この .val = valの; この .LEFT = 左; この .RIGHT = 右。 } 公共のTreeNode(){ スーパー()。 } }
バイナリソートツリーとしても知られても、二分探索木として知られ、バイナリ・ソートツリーとしても知られ、バイナリ検索ツリーとしても知られ、BST
これは、次のプロパティがあります。
空のツリーがある定義 BST
すべてのノードの値は、ルートの左サブツリーの値未満であります
すべてのノードの値がの根の右部分木の値よりも大きいです
左と右のサブツリーは、 BST(再帰的定義)
昇順シーケンスの前順
順次挿入 4 、2 、6 、2 、1 、3 、5 、1 、7 :
インサート4ルートノードが直接挿入され、インサート2は未満である4、左の挿入6より大きい4右側、インサート2未満である4左に、そして図4は、左2を、挿入されていない同じ比較挿入1未満である4左側にあり、左側の2が、より少ない2で2左、インサート3未満である4、左側により大きい2右側に、図5は、より大きい4 右側の、5 未満である6 左側に、以下4 左に、以下2 左側には、ある1が、移動しないに等しく、図7は、より大きい4 よりも大きい6。
挿入されたキーと値のペア:
順次挿入 {4:A}、{2 :B}、{6:C}、{2:D}、{1:A}、{3:D}、{5:E}、{1:F}
{2:D} 置き換える{2:B} 、{ 1:F} 置き換え{1:A}
バイナリ検索ツリーのバイナリ検索ツリー BST :小さい側の大きな側。
AVL :小の大きな側ながら、左右のサブツリーの高さの差のみすることができるが、 0 、1 。二分探索木は、極端な条件のリストになることです解決。
赤黒木: RedBlackTree 、RBT 。AVLは回転、およそ木のニーズ調整AVL 効率の高い検索効率が、低挿入や削除の上、今赤黒木を。
1 のような赤黒木 AVLは、いつものように絶対的なバランスを維持します
2. 相対的なバランス
3. もし H(左)> = H(右)、次いで:H(左)<= 2 * H(右)+ +1 が、BH(左)=== BH(右)ブラック等しい高さ、H (左)<H(右)同様に、
4. 定理: N のノードRBT 、最大高さは2ログ(Nの+ 1) 、参照厳しい証明CLRS
5. クエリの効率 RBT 未満AVL
6. より挿入、削除、効率良く AVL
赤黒木は平衡二分木、バランスアセンヤクノキのある Bのツリーは、本質的にクラスであるBツリー。するために小さな反対側の脇大きなリストを防ぐは小さくなるバランスになります。
AVLは、高さのバランスをとることによって達成され、SBTは、赤と黒のノードによってバランスを維持するためにバランスノードドメイン、赤黒木によって維持されます。赤黒ツリートラバーサルシーケンス非減少。
最初のツリー:行きがけ違反が衰えません。
レッスン3:ルートノードは黒です。
レッスン4:レッド子ノードは黒です。
第五の木:黒高は等しくありません。
赤黒ツリートラバーサルは単純です:左に行く未満は、右より大きい左。
幅と深さ優先トラバーサルに。
赤黒木の最短経路がリーフノードにルートから最長パスを超えていない 2 回。自己バランスを保証し、完全なリストはパスするように、低検索効率につながるになるためにノードが発生することはありません。
map.put(12、12)。
map.put(1、1)。
map.put(9,9)。
map.put(2、2);
map.put(0、0);
map.put(11、11)。
map.put(7,7)。
map.put(19、19)。
map.put(4、4);
map.put(15、15)。
TreeMapのインタフェース: