赤黒木
兄弟SとSの子どもは黒だが、Pは赤である。SとPの色を交換しても、Sを通る経路の黒ノードの数には影響しないが、Nを通る経路の黒ノードが1つ追加され、削除された黒ノードの分を補うことができる。
図表において、PがNの親ノード、SがNの兄弟ノード、CがSのNと同じ方向の子ノード(近いおい)、DがSのもう一方の子ノード(遠いおい)となる(Sは削除前のNの黒高さが1でなければならないので最初の反復でNILノードにはなれないが、CとDはNILノードになってもよい)。
図では、カレントノードNが親Pの左の子となっているが、Nは左右どちら側にも存在することが可能である。サンプルコードでは、サイド変数 dir によって、両方の可能性をカバーしている。
削除の初め(最初の反復)では、Nは削除されるノードの代わりにNILノードである。親ノードでの位置だけが重要なので、削除図の左欄には (意味:カレントノードNはNILノードで左の子)で記号化される。操作を進めると、(黒高さ ≥ 1の)非NILのノードもカレントノードになる可能性がある(例:ケースD1参照)。
削除図にある黒丸( と )を数えることで、Nを通る経路は他の経路より黒丸が1つ少ないことがわかる。これはPでの黒違反を意味する。
前の状態の列グループはケースを定義し、その名前がケースの列で与えられる。そのため、空欄のセルの値は無視される。
一覧表の行は、すべての可能なRBケースをカバーし、理解しやすいように並べられている。
回転の列は、回転がリバランシングに寄与しているかどうかを示す。
割り当ての列は、後続のステップに入る前にNへの割り当てが行われることを示す。これにより、他のノードP、C、S、Dも同様に再割り当てが行われる可能性がある。
兄弟Sは黒、Sの遠い子Dは赤である。Pでdir-回転した後、兄弟SはPとSの遠い子Dの親となる。PとSの色を交換し、Dを黒にする。部分木の根は依然として同じ色、すなわち赤か黒(図中の )であり、これは変換前も変換後も同じ色を指している。こうすることで、要件4が守られる。Nを通らない部分木の経路(図中のDとノード3を通る経路)は、以前と同じ数の黒ノードを通るが、Nには黒ノードの祖先が1つ追加される。Pが黒くなったか、Pが黒かったのにSの祖父母が黒くなったか、のどちらかである。したがって、Nを通過する経路は、さらに1つの黒ノードを通過するので、要件5が回復し、全体の木は赤黒木の形になる。
このアルゴリズムは、補助的なデータ構造を使用せずに入力を変換し、補助的な変数のためにわずかな記憶領域を余分に使用するだけなので、インプレースである。