【あかくろぎ】

赤黒木 とは?

最終更新:
💡 色分けルールで「自動的にバランスを保つ」木

ノードに赤か黒の色を持たせて平衡を保つ二分探索木。挿入・削除・検索がO(log n)で安定動作する。

📌 このページのポイント
色の規則を保つ二分探索木 13 8 17 1 11 15 25 NIL NIL NIL NIL NIL NIL NIL NIL 空の子を表すNILも黒 根は黒 / 赤の子は黒 どのNILへ進んでも黒の数は同じ 例:13 → 8 → 1 → NIL は黒3個 大小関係と色の規則で高さを抑える
赤と黒はノードの色そのもの。線は親子関係で処理の順序ではない。左の部分木の値は小さく、右は大きい。すべての空の子に黒いNILを描き、この例では根からどのNILへ進んでも黒は3個。NILは値を持つ末端ノードとは別で、左右の形を常に同じにする必要はない。
ひよこ ひよこ
普通の二分探索木じゃダメなの?
ペンギン先生 ペンギン先生
単純な二分探索木は挿入順で偏ることがあるよ。ソート済みの値を順に入れると一直線になり、検索がO(n)まで遅くなる場合がある。赤黒木は挿入・削除後に色の変更や必要な回転で規則を保ち、高さをO(log n)に抑えるんだ。左右の形が完全に同じになる必要はないよ。
ひよこ ひよこ
どんなルールがあるの?
ペンギン先生 ペンギン先生
よく使う定義では、①各ノードは赤か黒、②根は黒、③空の子を表すNILは黒、④赤の子は黒、⑤あるノードからどのNILへ進んでも黒ノード数が同じ、という規則があるよ。値を持つ末端ノードとNILは別なんだ。赤の連続を防ぎ黒ノード数をそろえることで、長い経路だけが伸びすぎないようにするんだ。
ひよこ ひよこ
AVL木とどう違うの?
ペンギン先生 ペンギン先生
AVL木は各ノードの左右の高さの差を1以内に保つ。赤黒木は色の規則で高さを抑えるので、条件はもう少しゆるいんだ。どちらも主要操作は最悪O(log n)。ただし「検索は必ずAVL、更新は必ず赤黒木が速い」とは言えないよ。回転数だけでなく、実装やデータの順番、操作の割合などを比べる必要があるんだ。
ひよこ ひよこ
実際にどこで使われてる?
ペンギン先生 ペンギン先生
JavaのTreeMapは赤黒木を使い、キーの順序を保って検索や追加・削除を行う実装だよ。順序付きのデータを扱うライブラリの性質を理解するのに役立つ。ライブラリの名前だけで内部構造を決めつけず、仕様と実装を確認しよう。O(log n)も実時間が常に一定という意味ではなく、要素数に対する計算量なんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「赤黒木」って出てきたら「色のルールで自動バランスする高速な木構造」と思えればだいたいOK!
📖 おまけ:英語の意味
「Red-Black Tree」 = 赤黒木
💬 ノードをRed(赤)とBlack(黒)に色分けしてバランスを保つ木構造だよ

参考資料

← 用語集にもどる