ブログ名

競技プログラミングやお歌のお話をする高菜です。

全ての AVL 木が赤黒木になるような彩色をもつこと

結論

次の条件が成り立つとき、かつそのときに限り、頂点を赤く塗ると良いです:(根については不成立としておきます)

  • 高さ*1が奇数で、
  • かつ親の高さが偶数

そうすると、高さが $h$ の AVL 木は黒高さ $\lceil \frac h 2 \rceil$ の赤黒木になります。

塗った結果の例

縦座標は高さです。AVL 木ですから、親と子の高さの差は $2$ 以下です。また赤黒木を 2-3-4 木と見たときの頂点を四角で囲っています。2-3-4 木としての高さと、AVL 木としての高さが対応していることも視覚的にわかりやすいです。

証明

  • 根が黒であること: 塗り方の定義に書いてあります。
  • 赤頂点が連続しないこと: 赤頂点の親の高さは偶数なので黒頂点です。
  • 全ての頂点について、その左右の黒高さが等しいこと: 左右の子の高さから黒高さを計算すると、自分が偶数、子が奇数のときだけ予定より $1$ 高くなってしまうように見えますが、この場合は(またこの場合に限り)子が赤くなり $1$ 減りますから、よいです。

直感的な理解

まずは先ほどの図のように、高さを縦座標として AVL 木を書きます。次に、下から $2$ 層づつに区切ります。すると各層の連結成分の大きさは $1$ 頂点以上 $3$ 頂点以下になりますから、これを 2-3-4 木とみなし、それに基づいて色を塗っていけばよいです。

*1:ある点から最も遠い葉へのパス上の頂点の個数