標準のコンテナが適合しない場合に使用するための、リンクされたリスト/バイナリ ツリー メソッドのライブラリがあります。これには、赤黒ツリーの処理が含まれます。
メソッドの 1 つは、二重連結リストから完全にバランスのとれた単純なバイナリ ツリーに変換しますO(n)
(アイテムの数が事前にわかっている場合)。このアルゴリズムは「フォールディング」として知られています。これは、Dr. Dobbs でかつて公開された二分木リバランス アルゴリズムの後半です。手順は基本的に...
ツリーのサイズを考慮して、左右のサブツリーのサイズを決定します
左サブツリーの再帰
リストからノードをポップして、ルートとして使用します
右のサブツリーの再帰
サブツリーをルートにリンクする
赤黒木を作成する同様の方法もあります。原則は同じですが、再帰はノードの高さを追跡します。高さがゼロのノードは赤で作成され、その他はすべて黒で作成されます。開始時の高さの計算は、ツリー サイズの最高セット ビットに基づいており、完全にバランスの取れた(2^n)-1
サイズのツリーが黒いノードのみを持つように調整されます (再帰は高さ 1 までしか下がりません)。
ここでのポイントは、リーフ レベルに赤いノードしかなく、最大で正確に半分のノードが赤いということです。
問題は、これは有効な赤黒木を生成する簡単な方法ですが、唯一のオプションではありません。完全にバランスの取れたツリーですべての葉が赤くなるのを避けることは、恣意的な選択でした。赤と黒のノードを交互に重ねることができます。または、場合によっては、完全にバランスが取れているサブツリーを見つけて、(赤いノードが必要な場合) サブツリーのルートをすべての葉ではなく赤にすることで、赤いノードの数を劇的に減らすことができます。
問題は、有効な赤黒木の形式を別の形式よりも選択する実際的な理由があるかということです。
これは純粋な好奇心です - 実際的な理由がないことはわかっていますが、この選択が重要な専門的なアプリケーションを知っている人はいますか?