OK、私はこれを試してみます.SOの他の善良な人々が助けてくれるかもしれません. 赤いノードの 1 つの考え方が、
- ツリー内に不均衡/新しいノードがある場所、および
- どれだけアンバランスか。
これが、すべての新しいノードが赤くなっている理由です。ノードが (ローカルに) バランスが取れている場合、色が反転し、赤みが親に渡されるため、親は兄弟に対して不均衡に見える場合があります。
例として、大きいノードから小さいノードにノードを追加する状況を考えてみましょう。ノード Z から始めます。これは現在ルートであり、黒です。Z の左の子である赤のノード Y を追加します。Z の子として赤の X を追加しますが、2 つの連続する赤があるため、右に回転させて色を変更し、バランスのとれたすべての黒を作成します。 (不均衡なし/「新しいノード」!) Y をルートとするツリー [最初の描画]。次に、W と V をこの順序で追加します。最初は両方とも赤です [2 番目の図] が、すぐに V/X/W が右に回転し、色が反転するため、X だけが赤になります [3 番目の図]。これは重要です。X が赤色であることは、Y の左側のサブツリーが 2 つのノードによってバランスが取れていないことを示します。つまり、左側のサブツリーに 2 つの新しいノードがあることを示します。したがって、赤いリンクの高さは、バランスが取れていない可能性のある新しいノードの数です。
ノードを追加するとき、赤みが常に渡されることに注意してください。カラー フリップでは、2 つの赤の子が黒になり、親が赤く着色されます。基本的に削除が行うことは、このプロセスを逆にすることです。新しいノードが赤であるように、常に赤のノードも削除したいと考えています。ノードが赤くない場合は、最初に赤くします。これは、カラー フリップによって行うことができます (ちなみに、これが、3 ページ目のコードのカラー フリップが実際にはカラー ニュートラルである理由です)。したがって、削除したい子が黒の場合、親の色を反転することで赤にできます。これで、子は確実に赤くなります。
次に対処すべき問題は、削除を開始するときに、削除するターゲット ノードが赤かどうかわからないという事実です。1つの戦略は、最初に見つけることです。ただし、あなたの最初の参照を読んだところによると、そこで選択された戦略は、ツリーを下方向に検索しているときに、検索ノードの前に赤いノードを「押し込む」ことにより、削除されたノードを確実に赤くできるようにすることです。削除するノード。これにより、不要な赤いノードが作成される可能性がありfixUp()
、ツリーを遡る途中で手順が解決されます。fixUp()
おそらく、通常のLLRBT不変条件を維持します:「連続する赤いノードなし」および「正しい赤いノードなし」。
それが役立つかどうか、またはコードのより詳細な調査に入る必要があるかどうかはわかりません.