赤黒ツリー構造とアルゴリズムの実装

赤・黒のツリー構造

下に示すように、赤と黒(赤黒木)の数は、自己均衡二分探索木である:
ここに画像を挿入説明
条件は、これに基づいて独自のルールを増加させるために、最初の赤と黒の数は、二分探索木で満たされる必要があります。

バイナリ検索ツリーのルール

  1. 任意のノードの左の部分木がnull、左の部分木の、値ではない場合、すべてのノードがそのルートの値未満であります
  2. 任意のノードの右サブツリーが空でない場合、右サブツリー・ノードは、そのルートの値より大きいすべての値であります
  3. 左と右のサブツリーの任意のノードが二分探索木です
  4. いいえ同等のキーノードません

定期的な赤黒木

  1. ノードは、赤または黒です。
  2. ルートノードは黒です。
  3. 二人の子供それぞれ赤ノードは黒です。(レッドあなたは各ルートからリーフまでのすべてのパス上の2つの連続したノードを持つことはできません)
  4. 任意のノードから各パスの全ての葉に黒のノードの同じ番号が含ま。

彼らは速く見えるが遅いAVLを挿入するのでAVL木と赤黒木は、より汎用性があり、挿入を見つけるために赤黒木は非常に優れています。

赤黒ツリーアルゴリズム

回転アルゴリズム

注:A、B、C持っている子ノードが可能です。

左利き
ここに画像を挿入説明
右利き
ここに画像を挿入説明

挿入アルゴリズム

次のように全体的な手順は次のとおりです。

  1. 最初のステップ:バイナリ検索ツリーとして赤黒木は、ノードが挿入されています。
  2. ステップ2:色の挿入ノードが「赤」です。
  3. 第三段階:一連の操作によって回転または再度赤黒木になるように、着色されました

挿入は赤理由ノード:赤で挿入されたノードを、「機能(5)」を違反しないでしょう!いくつかの特性に反して、それは我々が少ないに対処する必要があることを意味します。

ステップの調整:

  1. インサートは、ルートノードである場合、このノードは、直接黒塗装します。
  2. 親ノードが挿入されている場合は、ノードが黒で、何が行われる必要がありません。
  3. 親ノードが挿入されている場合、ノードは赤叔父ノードが赤色である場合、親ノードが黒となる叔父、祖父ノードターンを調整し続けて、ノードの祖父に、現在のノードとして、赤。
  4. 親ノードは、ノードが赤の挿入された場合、ノードは黒叔父です。4例に分け。

次のとおりです。

  1. 現在のノードが父親が子供を残している、父親はアイデアを子供の祖父(左左)、契約を左:祖父母は右利きになり、親や祖父母のB色の交換を...
  2. 左左の状況を使用し、その後、Bと、現在のノードとして親ノードL、および親ノード:現在のノードは、父親が子供の祖父(左右)、アイデアとの契約を残した父の右の子です。
  3. 親や祖父母のB色交換、祖父母が残されます:現在のノードは、父の右の子で、父親は右の子(右右)のアイデアで、契約の祖父です。
  4. 現在のノードは、父が右の子(左右)、アイデアとの契約の祖父である、父は子を残している:右利き親ノード、および現在のノードとして親ノード、bは右右の状況を使用しています。

挿入アルゴリズムの例示的な調整プロセス

赤黒木3例を調整します

  1. ルートノードが挿入されている:このノードは、直接黒塗装します。
  2. 親ノードに挿入されている黒です:何も実行する必要がありません。ノードが挿入された後、それはまだ赤黒木です。
  3. 親ノードに挿入されている赤です:必要性を調整します。

親ノードは両方の場合に赤

  1. 現在のノードの親は赤であり、現在のノードの叔父は赤色です。
  2. 現在のノードの親は赤色であるが、現在のノードの叔父は黒色です。

第一のタイプのために:叔父ノードは、以下のステップ赤。

  1. 「親」、「アンクル・ノードは、」黒に設定されています。
  2. 「祖父母」「赤。」
  3. 次いで、「現在のノード」から「祖父母」(新たに挿入されたノード)、「現在のノード」動作を続けます。

以下、新たに挿入されたノード35は、祖父母ノード60の必要性は、動作を継続します。
ここに画像を挿入説明
親ノードは、ノードが黒の叔父で、赤

4例に分け:

  1. 現在のノードが父親が子供を残している、父親はアイデアを子供の祖父(左左)、契約を左:祖父母は右利きになり、親や祖父母のB色の交換を...
  2. 左左の状況を使用し、その後、Bと、現在のノードとして親ノードL、および親ノード:現在のノードは、父親が子供の祖父(左右)、アイデアとの契約を残した父の右の子です。
  3. 親や祖父母のB色交換、祖父母が残されます:現在のノードは、父の右の子で、父親は右の子(右右)のアイデアで、契約の祖父です。
  4. 現在のノードは、父が右の子(左右)、アイデアとの契約の祖父である、父は子を残している:右利き親ノード、および現在のノードとして親ノード、bは右右の状況を使用しています。

最初の2種類の場合:叔父ノードは黒で、現在のノードがその親ノードの右の子で、次の手順を実行します。

  1. 「親」「新しい現在のノード。」
  2. 支点として「新しい現在のノードが」左。(支点Aは左上の画像に対応するノード)
  3. チェックと調整を続けます。

以下に、私たちは前のステップによって運営されて60ノードする必要があります
ここに画像を挿入説明

最初の3種類の場合:叔父ノードは黒で、現在のノードがその親ノードの左の子で、次の手順を実行します。

  1. 「親」「黒」。
  2. 「祖父母」「赤。」
  3. 支点として右利き用「祖父母」で。(支点Aは、右上の画像に対応するノード)
  4. チェックと調整を続けます。

ここに画像を挿入説明

削除アルゴリズム

https://www.jianshu.com/p/84416644c080
次の一般的な手順を削除します。

  1. 最初のステップ:バイナリ検索ツリーとして赤黒木は、ノードが削除されます。
  2. ノードがリーフノードである場合は、削除、および赤され、それが直接削除されます。
  3. ノードが除去されたリーフノードであり、黒である場合、この場合は、ノードがゼロ、操作(以下に詳述)をバランスさせるためのゼロノードと交換し、ノードを削除するために、調整する必要があります。
  4. ノードのみリーフノードを削除された場合、それは黒ノードでなければならず、その子ノードは、赤色(決定の赤黒木特性)です。子ノードの削除ノード、および色黒の子ノードを持つ親、黒保証の数にこの時間。
  5. 最小ノードが2つのつの子ノードを持っている、ノード削除は、右部分木(後続ノード)を見つけ、その後、削除されたノードを交換してください。ノードの後継者はリーフノードまたはサブツリーのみでなければならないため、現在のノードとして後続ノードの元の位置は、2,3,4ハンドル状況に行きます。

最初の3例、バランス操作することの必要性のために、我々は意志

  1. 現在のノード(ゼロ)がルートである、動作しません。
  2. すべての黒の兄弟の子ノード、親ノードが赤色である場合、現在のノード(NIL)兄弟は、黒色である:交換ノードの父と兄弟の色バランスを終了します。
  3. すべての黒の兄弟の子ノード、親ノードが黒の場合、現在のノード(ゼロ)の兄弟は、黒です:兄弟は赤塗装、継続するために、現在のノードとして父ノード。
  4. 子ノードは左の兄弟は、左の部分木が赤である、すべての黒の兄弟でない場合、現在のノード(NIL)兄弟が、黒色である:ノードの父と兄弟の色を切り替え、父ノードに右、兄弟左の部分木はバランスを終了し、黒塗装しました。
  5. 兄弟、父ノードに右、ノードの父と兄弟の色を切り替える:現在のノード(NIL)兄弟は、子ノードが全て黒の兄弟、兄弟右ない場合には、その右部分木は赤、黒であります右のサブツリーがバランスを終了し、黒塗装しました。
  6. 子ノードの兄弟は、左のすべての黒、兄弟でない場合、現在のノード(NIL)兄弟は、黒で、左の部分木は黒:兄弟は、左、右の部分木の色変換に兄弟と兄弟ノードを切り替えます場合は第4回。
  7. 子ノードは、すべて黒の兄弟でない場合、現在のノード(NIL)兄弟は、黒色であり、兄弟は右、その右の子が黒である:兄弟右回り、左サブツリー交換カラー兄弟と兄弟ノード5への変換の場合です。
  8. 右利きの親ノードに左兄弟ノード場合、現在のノード(NIL)兄弟ノードの父と兄弟の色を切り替え、赤、黒の兄弟状況に変換します。
  9. 右の兄弟は、ノードの父と兄弟の色を切り替え、親ノードに任せた場合、現在のノード(NIL)兄弟は、赤ノード兄弟の変換の場合は黒です。

ここに画像を挿入説明

ここに画像を挿入説明
最初のステップは、次のような状況を削除するには:

  1. 削除されたノードは、葉ノード、直接削除ノードである何の息子を持っていません。
  2. 唯一の息子のノードが削除され、ノードを削除し、ノードのユニークな場所の子ノードと交換してください。
  3. ノードが削除されようとしている子供を持っている場合は、最初の最小のノードの右部分木ノード削除(後続ノード)を見つけ、その後、削除されたノードを交換してください。

詳細図は次のとおりです。
ここに画像を挿入説明

以下の場合のステップ調整ツリー

  1. ノードは、再バランスに色を除去するために長いノードにカラー交換ノードと同様に、調整する必要赤ではありません。
  2. ノードは、回転させる必要が黒色着色剤であります

オリジナルリンク:
https://blog.csdn.net/yy_0733/article/details/95164590
https://www.jianshu.com/p/7b38abfc3298?utm_source=oschina-app
https://www.cnblogs.com/nananana /p/10434549.html

動作例赤黒木

1最初の要素については、空の赤黒木、赤挿入ノード、規定の第二の違反、メイク色操作に挿入され、以下に示すように、ノードは、黒に変化します。
ここに画像を挿入説明

第2は、以下に示すように、さらに、任意の変色なしに動作する2つのつの子ノードを挿入します。
ここに画像を挿入説明

第3の親ノードB及びC叔父新しいノード(別の子ノードのノードの祖父は)第IIIに違反し、また赤であるため、挿入されたノードBに左の子ノードDに、最も簡単な方法であります黒の親ノードBとノードC叔父、以下のように。
ここに画像を挿入説明

4 D Eノードの左の子に挿入され、Eは赤ノード最初の挿入を挿入し、その親ノードDが赤色であり、新たに挿入されたEがその親ノードDの左の子であり、溶液は、それが最初の親ノードDは、図1に示すようにブラック、祖父母ノードBターンは、支点として祖父母ノードBへの右回転、次いで赤色となります。
ここに画像を挿入説明
5ノードBには、F.ノード右の子に挿入され、父親と叔父、ノードE、ノードBは、親ノードBを赤で、図示のように、ノードEは、赤、黒の叔父と祖父母ノードDターンに変更されます。
ここに画像を挿入説明

第六の複数、以下に示すように、いくつかのノードの観察を容易にするために、後ろに挿入されます。
ここに画像を挿入説明

7は Kに左の子ノードGに挿入され、叔父のノードおよびその親ノードは赤であり、従って、親ノードは、図から、以下のように黒の叔父と祖父母ノードターンが、赤くなる。1 2となります。こうしてBとDになる競合が赤、次いでBが新たに挿入されたノードとみなされ、親ノードBは、黒叔父ノード赤であり、そしてBはDに対して支点として、その親ノードの右の子であります図のように、左に回転させた。3 4(青い矢印が転送を意味するものではない位置のノードに接続されていることを示す)となります。次に、B及びDは、依然として競合赤であり、Dが新たに挿入されたノードを見るであろう、その親ノードBは、黒叔父ノードC赤色であり、その親ノードBの左の子であるため、その親ノードは、意志Bが黒くなり、祖父母ノードAターン全体赤黒木がバランスされるように、再びなる次の5 6 7に、右回転の支点として、赤、ノード。
ここに画像を挿入説明
ここに画像を挿入説明
ここに画像を挿入説明

操作参考ます。https://blog.csdn.net/duduhonghong/article/details/83860904
部分参照します。https://www.cnblogs.com/2sheep2simple/p/10780560.html

公開された67元の記事 ウォン称賛32 ビュー60000 +

おすすめ

転載: blog.csdn.net/weixin_43751710/article/details/104637909