【あかくろぎ】

赤黒木 とは?

💡 色分けルールで「自動的にバランスを保つ」木
📌 このページのポイント
赤黒木(Red-Black Tree) 13 8 17 1 11 15 25 NIL NIL 赤黒木の5つのルール ルートは黒 赤の子は黒 NILは黒 黒の高さが均一 → O(log n)
赤黒木の構造イメージ
ひよこ ひよこ

普通の二分探索木じゃダメなの?

ペンギン先生 ペンギン先生

普通の二分探索木はデータの挿入順によって偏る。ソート済みデータを順番に挿入すると一直線(リスト状)になって、検索がO(n)に劣化する。赤黒木は挿入・削除のたびに色の規則に従って回転操作を行い、木の高さをlog nに保つ。どんなデータ順でも安定した性能が出るんだよ

ひよこ ひよこ

どんなルールがあるの?

ペンギン先生 ペンギン先生

5つの不変条件がある。①各ノードは赤か黒、②ルートは黒、③葉(NIL)は黒、④赤ノードの子は必ず黒(赤が連続しない)、⑤任意のノードから葉までの黒ノード数が同じ(黒高さが等しい)。この条件が崩れたら回転と色の変更で修復する。④と⑤が木のバランスを保つ核心だよ

ひよこ ひよこ

AVL木とどう違うの?

ペンギン先生 ペンギン先生

AVL木は左右の部分木の高さの差が最大1と厳密にバランスを保つ。赤黒木はもう少しゆるい条件。結果として、検索はAVL木の方がわずかに速い(木が低い)が、挿入・削除は赤黒木の方が速い(回転操作が少ない)。読み取り頻度が高いならAVL木、書き込みが多いなら赤黒木が有利だよ

ひよこ ひよこ

実際にどこで使われてる?

ペンギン先生 ペンギン先生

至る所で使われているよ。JavaのTreeMap/TreeSet、C++のstd::map/std::set、LinuxカーネルのCFS(Completely Fair Scheduler)、Nginx の timer管理。自分で実装することはまずないけど、ライブラリの中身を知っておくとパフォーマンス特性を理解できる。競技プログラミングでは平衡二分探索木としてたまに出題されるよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「赤黒木」って出てきたら「色のルールで自動バランスする高速な木構造」と思えればだいたいOK!
📖 おまけ:英語の意味
「Red-Black Tree」 = 赤黒木
💬 ノードをRed(赤)とBlack(黒)に色分けしてバランスを保つ木構造だよ
← 用語集にもどる