Upgrade to Pro — share decks privately, control downloads, hide ads and more …

赤黒木を理解する / Understanding Red-Black Tree

nafuka
November 16, 2021

赤黒木を理解する / Understanding Red-Black Tree

nafuka

November 16, 2021
Tweet

More Decks by nafuka

Other Decks in Programming

Transcript

  1. ざっくり言うと木のようなデータ構造 - 節点(node) データが入った1要素 - 根(root) 頂点にあたるノード 使うときは根だけ持っておいて、 根から各ノードを辿っていく -

    枝(edge) ノードとノードのつながり ポインタで表現する - 葉(leaf) 末端のノード 木とは 01 赤黒木とは 5 根(root) 枝(edge) 節点(node) 葉(leaf)
  2. 各ノードと、それを管理する木のデータがある • 親ノードへのポインタ • 左の子ノードへのポインタ • 右の子ノードへのポインタ • 値 •

    色(黒 or 赤) 赤黒木のデータ構造 01 赤黒木とは 15 • 根となるノードのポインタ • NULL相当のノードのポインタ( NIL) 番兵ノードと呼ばれる 頑張ればNULLでも実装可能 ノード 木
  3. 02 赤黒木のルール 5つのルール 1. 各ノードは赤か黒 2. 根は黒 3. 全ての葉(NIL)は黒 4.

    あるノードが赤なら、その子ノードは黒 5. 各葉と根を結ぶ道は同じ数の黒ノードを持つ 17
  4. 1. 削除するノードの、次に大きいノードを探す 2. 削除するノードと、次に大きいノードを入れ替える • 次に大きいノードの場所によって、2パターンに分岐 3. 次に大きいノードの色を、削除するノードの色に変更する • 0,

    1個の場合と異なり、 削除される色は、次に大きいノードの色 色分け + 回転をする際は、 もともと次に大きいノードがあった位置のノード(x)から 削除による影響がないか見ていく 削除するノードの子が2個の場合 04 赤黒木の操作:削除|子が2個の場合の入れ替え(1/5) 38
  5. while (xが根でない && xの色が黒) { xの兄弟の色、xの兄弟の子の色に応じて パターン分けして、色分け + 回転 }

    xの色を黒にする 色分け + 回転の流れ 04 赤黒木の操作:削除|色分け + 回転:流れ(1/3) 43
  6. while (xが根でない && xの色が黒) { xの兄弟の色、xの兄弟の子の色に応じて パターン分けして、色分け + 回転 }

    xの色を黒にする 色分け + 回転の流れ 04 赤黒木の操作:削除|色分け + 回転:流れ(2/3) 44 xが根でない  → 初期状態では起こらない    ループを回って根に到達した際に抜ける xの色が黒  → xの色が赤なら、黒にすれば    黒の数が削除前と同じになる
  7. 色分け + 回転の流れ 04 赤黒木の操作:削除|色分け + 回転:流れ(3/3) 45 while (xが根でない

    && xの色が黒) { xの兄弟の色、xの兄弟の子の色に応じて パターン分けして、色分け + 回転 } xの色を黒にする パターンは4つ × 左右2通り (右の場合は反転して考える) 1. 兄弟の色が赤 2. 兄弟の色が黒 + 兄弟の子が左右どちらも黒 3. 兄弟の色が黒 + 兄弟の子の左が赤、右が黒 4. 兄弟の色が黒 + 兄弟の子の右が赤
  8. パターン2. 兄弟の色が黒 + 兄弟の子が左右どちらも黒 04 赤黒木の操作:削除|色分け + 回転:各種パターン(2/4) 47 兄弟の色を

    赤にする 兄弟の色を赤にする。見るノードを親として再度ループを回る (木を登っていくイメージ) 黒の個数 1 2 2 1 1 1
  9. パターン4. 兄弟の色が黒 + 兄弟の子の右が赤 04 赤黒木の操作:削除|色分け + 回転:各種パターン(4/4) 49 各ノードの数が揃うパターン

    見るノードを根として、ループを抜ける 親と兄弟の 色を交換 右を黒に 親を左回転 黒の個数 1 or 2 2 or 3 2 or 3 2 or 3 3 or 4 2 2 or 3 2 or 3 2 or 3
  10. 『アルゴリズムイントロダクション 第3版 第1巻』 • オススメの読む順番:付録 B.5 木 → 12 2分探索木

    → 13 2色木 木 (数学) - Wikipedia • 木の図を参考にさせていただきました。 Red-black tree deletion: steps + 10 examples - YouTube 参考文献・URL 05 最後に(2/2) 56