学びのデータ構造のバイナリツリーの概念を認識しているが、そのような完全なバイナリツリー、完全なバイナリツリー、バイナリ検索ツリー、バランスの取れたバイナリツリー、バイナリ、などの完璧なような、より一般的な二分木の種類は、多くありますが、今日は言っていること、赤、黒の木であります非厳密な平衡二分木、平衡二分木は、自然のバランスを維持する挿入、検索、比較的高い効率を削除するために、自動的にバイナリ検索ツリーに基づいて増加されます。赤黒木は、礎石のTreeMapのストレージ構造です。
A.バイナリ検索ツリー
二分探索木と呼ばれるバイナリ検索ツリー、バイナリ・ソートツリーは、我々は典型的な二分探索木を見て、それのこのバイナリ定期的な機能は何ですか?
- 左サブツリーのノードはノード自体よりも小さいです。
- 右部分木のノードは、ノード自体よりも大きいです。
- サブツリーバイナリ検索ツリーとほぼ同じ。
この図は、典型的な二分探索木であります
二分探索木はバランスの取れたバイナリツリーの基本である、私たちはどのようにその検索ステップを見て
私たちは、バイナリツリーの値が知りたい58のノードを
ステップ1:ルートノードを検索し、ノード60の値
ステップ2:我々はノード58のサイズを探している値を比較するために、
等しい場合には、お祝いの言葉は、発見されています。
未満の場合、左のサブツリーを探し続けます。
もしそうなら、右のサブツリーを見つけます。
明らかに、58 <60は、現時点では、我々はノードの位置を特定する必要があり、左の部分木56内のノードを見つける56
第三ステップ:規則に従って第2のステップは探し続けます
我々は、右のサブツリーを探し続け、右の子ノード58、お祝いの言葉、私たちが発見したこの時間に移動する必要があります58> 56。
私たちは、実際には、我々は通常、バイナリ検索、非常に効率的に見つけるように見える二分探索木を呼んで、発見された三つのステップを経るが、同じようにそれは、次の二分探索木として、欠陥を持っています。
厄介な、ラメ典型的な大きな足の場合、このような二分探索木を参照してください、私たちは50個のノードの値を探しているなら、それは、また、二分探索木で、かつ単一のリストクエリは基本的に大きな違いはありませんが、パフォーマンスのために、大幅に削減。我々は平衡二分木に基づいて、ステージ上にバイナリツリーをバランスこの時間は、自然のバランスを維持するために自動的に追加で二分探索木です。
自己バランシング後の大きな足ラメ二分探索木の上に、それは以下のようにバイナリツリーになる可能性があります。
自己均衡した後、その後、50のノード値に行き、検索のパフォーマンスは、多くのことを改善します。厳密に平衡二分探索木ではありません赤黒木。
II。定期的な機能、赤、黒の木
赤黒木のが具体的な特徴は、それは何のルールがありますか?
- ノードは、赤または黒に分けられます。
- ルートノードは黒でなければなりません。
- リーフノードは黒であり、nullです。
- ノードに接続された2つのつの子ノード黒赤(赤 - 黒ツリーノードに隣接する赤色表示されていません)。
- 任意のノードからの経路の各リーフノードに黒のノードの同じ番号が含ま。
- 新しいノードは、赤黒木ノードに追加されます。
ルールは、赤黒木は平衡二分木であるので、はい、たくさんのように見え、あなたは自動的に自然のバランスを維持する必要があり、自己持続的なルールは、トップ6赤黒木が与えられて持つ必要性のバランスをとります
私たちは、それはどのようなものであるか最終的に、典型的な赤黒木を見てみましょうか?
加えて、少しのルールの最初の解釈は、文字通りの意味を表示するには、だけでなく、隠された、それは何を意味するのでしょうか?
まず、パスの葉ノードへのルートノードから2回、最長最短経路よりも大きくありません
最短経路のパスを計算するには?
ルール5から、我々は、ルートノードから各リーフノードに黒のノードの数は、純黒のノードの経路が最短経路と同じであることを知っています。
パスはどのような最長パスと見なさ?
ルール4および図3に示すように、赤ノード、ブラックノード、すなわち黒ノード(またはノード赤)、経路が最長で、黒と赤のノードの数が同じノードである場合、接続が必要な場合* 2
第二なぜ新た赤色ノードする赤黒木のノードに追加されます
それがない限り、新しい黒のノードならば、この時点で、それは確かにルールを破るが、必ずしも赤ノードに参加できない、各リーフノードへのルートノードから黒のノードの数が現在の赤黒木が同じで、ルール4から知っています赤色は、このように赤ノードの追加、親ノードであり、ルールを破る可能性も小さく、また、例示する例をみましょう。
いずれにせよ、構造は、赤黒木はそれを破壊するのだろうか?次いでバランス[維持するバランス破壊、主に二つの方法を維持する方法変色 ]および[ 回転 ]、[ 回転 ]分割[ L ]と[ 右手 ]、二つの方法は、互いに組み合わせてもよいです。
ここでは、2つのシナリオからの挿入および削除を説明するために、
III。赤黒木ノードが挿入されています
挿入ノードにおいて、我々はそう赤黒木に、66である場合
明らかに、このような構造は、依然としてノードの平衡状態を開始せずに調整する6大、自己均衡機構の規則に従うための時間です。
値は再び内部ノード51、従って赤黒木にこの時間を挿入した場合
それは明らかである今では構造4、あなたはバランスノードを調整するために、自己分散メカニズムを起動する必要があり、この時のルールに従いません
3.1色
私たちは、ルールを満たすために、途中で赤黒ツリー構造を色を変更することができます
- 第1のアドレス設定は、このルール4(赤接続ノード、ノード49-51)に従っていない、ノード49は、黒にする必要があります。
- この時点で、我々は、我々は赤ノードノード45に変更され、それがルール5(他の経路より56-49-51-XX経路黒ノード)に違反していることを見つけます。
- 母、姉だけでなく、ルール4の違反(ノード56-45-43に接続された赤のノード)、我々は黒ノード56とノード43ノードであろう。
- しかし、我々は、この時点でとルール5(黒ノード60-68-XXよりも黒のノード60から56-XXパス)の違反で見つかったので、私たちは、ノード68は黒で調整する必要があります。
- コンプリート!!
ツリーの最終調整後:
しかし、それほど幸運ではないすべての回で、目的の色を介して直接到達することができ、ほとんどの時間は、回転によって対処する必要があります。
次のツリーに基づくように、ノード65が追加されています。
挿入ノード65の後に、次の手順
この時、あなたはノードのノード64赤や黒のいずれかのノードのために、黒のノードのパスで、ルール5に違反することになることがわかります合意に達することができなかったが、唯一の[カラー]により、この時間は、目標を達成することができませんでした。我々は、もちろん、[回転]の操作は、一般的に[カラー]で動作する必要があり、操作を回転させる必要があります。
[含む回転左 ]と[ 右回り ]
L:
二つのノードの回転反時計回りに、ノードが左の子の右の子になりつつノードは、その右側の子ノードに置き換えられるように
次のようにLの手順は次のとおりです。
PLの左の子ノードGおよび左の子ノードGとC2との関係を壊し、アプリケーション点一方、第1のノードC2その右の子ノードへの参照点ながら、右の子ノードG PLとの関係を壊します
D-:
二つのノードの時計方向の回転ノードが左の子ノードの右の子になっている間、ノードは、その左の子ノードを交換するように
次のようにブドウ糖の手順は以下のとおりです。
第1の左の子ノードのノードC2に基準点が、左の子ノードG PLとの関係を壊し、そして関係PLと右の子ノードC2を壊し、Gの右側の子ノードのアプリケーション点PL一方
シーンは、次の4つのカテゴリに分かれて変色によって回転することはできません。
3.2 Zuozuoノード回転
この場合、以下に示すように、親ノードおよびノードが、左ノードを挿入されている(原図を回転させる。1以下)、このような場合、我々は、ノード65を挿入しなければなりません
次のようにルールは、次のとおりで、[右回り]祖父母する[カラー]
ルールは、次のステップとして:
ノードは約3.3回転します
この場合、親ノードは、左のノードは、ノードが、元の回転図1に、右ノードに挿入されている、我々はノード67を挿入したいです
次のように規則がある:父ノード[L]、次に[デキストロース]と祖父母ノード、[色]
ルールは、次のステップとして:
3.4右左回転ノード
この場合、右のノードが親ノードは、(以下に示すように、ノードが、挿入される左ノードである元の図を回転させる。2)この場合、我々は、ノード68を挿入しなければなりません
次のようにルールは次のとおりとその後父親[デキストロース]ノード、祖父母ノード[L]、[色]
ルールは、次のステップとして:
右右回転ノード3.5
この場合には、親ノードと右ノードノードが挿入され、図オリジナルの回転2、我々は、ノード70を挿入しなければなりません
次のようにルールは、次のとおりで、[L]祖父母する[カラー]
ルールは、次のステップとして:
3.6赤黒木インサート要約
調整する必要はありません | バランスを達成するために、[カラー] | [カラー] +回転利用可能な残高 | |
---|---|---|---|
ケース1: | 子ノードを親ノードに挿入されると黒です | ルートノードの空の木、黒に赤ルートノード | 親ノードは、赤色の左ノードであり、ノードは黒叔父であり、左の子を挿入し、[ノード]を回転させる程度によって |
ケース2: | - | 親と叔父赤のノード | 親ノードは、赤色の左ノードであり、ノードは、右の子ノードに黒の叔父、回転によって[約]次にノードであります |
ケース3: | - | - | 親ノードは、右と左の[ノード]を回転させ、左の子を挿入し、ノードが黒の叔父である、赤右ノードであります |
ケース4: | - | - | 右の子ノードに赤右ノードの親ノード、ブラックノード叔父、右ノード] [スイング右スルー |
IV。赤黒木のノードの削除
赤黒木のノードの挿入と比較すると、削除ノードは、より複雑で、私たちは、子ノードがnullと次元を考えるための赤であるかどうかを議論する必要があります。
少なくとも1つのサブセクション4.1はヌルであります
子ノードを削除するノードには、少なくとも1つのノードは、ノードを削除した後、ノードは、違反があれば、すべては、現在のノードはもちろん、nullに設定され、nullの場合、現在のノードができるのではなく、その値を持つことになりますnullでありルールは、調整は、[]、および[変色】回転として、必要とされます。
4.2子ノードは、非ヌルノードであります
この場合は、
最初のステップ:ノードの後継者や先行を見つけます
前駆:ノードの左サブツリー最大値(おそらくヌルとして、ほとんどの非ヌルの子ノードで得ることができます)。
後継者:右サブツリー・ノードの最小値(唯一つの非ヌルサブノードまで引き出すことができる可能性がヌルです)。
先行および後続ノードがノードの値に最も近い値、ノード.prev =先行など、ノード.next =後継者です。
ステップ2:ノードへのコピー先行または後続の値が、その後、後継者または前任者を削除します
あなたはノードが残って削除した場合、その値が先行ノードにコピーされ、その後、前駆体を削除し、あなたは、その右のノードを削除し、後続のノードに値をコピーし、後継者を削除した場合。
これは、「トリッキー」アプローチに相当し、私たちの目的は、ノードのノード値を削除することである赤黒ツリーに存在していないので、目的に焦点を当て、私たちは本当に削除ノードを削除するかどうかについて、その心配はありません頻繁に自動平衡メカニズムは、木そのものの構造を調整することになるため、ノード、我々はまた、ツリー構造の変化を考慮する必要があります。
我々はすでに我々が実際に先行または後続で削除したいので、私たちは、その後の学習は、いくつかの例を含む、前駆体を参照することができ、メインラインへの前駆体を説明する必要がある、と述べてきました
4.2.1先行ノードは黒色であり、非ヌルの子ノードを有しています
分析:
削除したいのでノード64、残されて見つけるためのノード63の前駆体を、
次いで、前駆体63の値代替値64と、2つのノードの値(ノードが削除されると前駆体)は、ノード63を削除します。
削除プロセスの中間部分は、地図上に存在する場合、前駆体63が、我々は、自動バランス調整の必要性故に、ルール4赤黒木に準拠していないことを見出しました。
ここでは、直接[通じ色 ]完了します。
4.2.2黒ノードの前駆体、および子ノードがnull
分析:
削除したいのでノード64、残されて見つけるためのノード63の前駆体を、
次いで、前駆体63の値代替値64と、2つのノードの値(ノードが削除されると前駆体)は、ノード63を削除します。
削除プロセスの中間部分は、地図上に存在する場合、前駆体63が、我々は、自動バランス調整の必要性故に、ルール5赤黒木に準拠していないことを見出しました。
ここでは、直接[通じ色 ]完了します。
4.2.3前駆赤ノード、子ノードがnullであります
分析:
削除したいのでノード64、残されて見つけるためのノード63の前駆体を、
次いで、前駆体63の値代替値64と、2つのノードの値(ノードが削除されると前駆体)は、ノード63を削除します。
削除前駆体63を、ツリー構造は、ルールを破るしませんでした。
4.3赤黒木の要約を削除
赤黒木は、より多くのケースを削除するだけでなく、次の条件が存在します。
削除ノードがnullに設定されているルートに直接、次に、ルートノードです。
左と右の子ノードは、ノードがnullで削除する、削除ノードがnullに設定されています。
左と右の子ノードを削除するノードは、ノードの値を交換するノードが存在する、値を持っています。
左および削除するノードの右の子ノードがnullでない場合、ノードへの後継者または前任者、コピー先行または後続の値を見つけ、その後、先行または後続を削除します。
削除赤黒ツリーノードの不均衡を引き起こすことができる方法は、次に我々は、[カラー] + [回転]、調整するためのバランスをとるために、だけでなく、上記の例を与えるに合格する必要がありますが、たくさん練習することを示唆している、ではなくBibeiダウン。
V.の概要
本稿では、簡単にビットのバイナリ検索ツリーを話し赤黒木、赤黒木最初のベースのバイナリ検索ツリーの関連する原則を説明し、検索プロセスについて話した後、6大赤黒木のための定期的な機能、赤黒木の挿入、削除、説明するためにグラフィックスの多くを使用し、技術は実際には、十分に理解したときに、書き込みを開始するとき、実際のうち、時々もっともらしい多くの場所です。このようTreeMapのとTreeSetのように、赤黒木が広く使用されて使用してください赤黒木の実装に基づいて、リストは8赤黒木より大きい長さに変換されますときにHashMapでJdk8は、赤黒木はより複雑である、と私はまだ学んでいたされていますこのプロセスは、何か間違った場所がある場合は、批判を喜ばとあなたが一緒に進歩を遂げることを期待感謝します。