私は証明が苦手で、以下は穴だらけだと思いますが、何か前向きなことになるかもしれません。
ノードの削除後に最小化されたAVLツリーでk回転を実行するには、次の条件が満たされている必要があります。
- ターゲットノードは、4ノードのサブツリーに存在する必要があります。
- ターゲットノードは、短いブランチ上にあるか、サブツリーのルートであり、短いブランチのリーフに置き換えられている必要があります。
- ターゲットサブツリーのルートの祖先の各ノードは、わずかにバランスが崩れている必要があります(バランス係数は+/- 1)。つまり、バランス係数が0になると、回転チェーンが停止します。
最小化されたツリーのノードの高さと数は、次の式で計算されます。
H(k)=k回転の影響を受ける木の最小の高さとします。
H(k) = 2k + 1, k > 0
N(h)=高さhの(最小ノード)AVLツリー内のノード数とします。
N(0) = 0
N(1) = 1
N(h) = N(h-1) + N(h-2) + 1, h > 1
F(k)=k回転の影響を受けるツリー内のノードの最小数とします。
F(k) = N(H(k))
(例えば:)
k = 1, H(k) = 4, N(4) = 7
k = 2, H(k) = 6, N(6) = 20
証明(それがそうであるように)
最小の高さ
削除すると、ノードが4つ以上あるツリーのローテーションのみが発生します。
- 1ノードのツリーのバランス係数は0である必要があります。
- 2ノードのツリーのバランス係数は+/-1である必要があり、削除すると1ノードのバランスツリーになります。
- 3つのノードのツリーのバランス係数は0である必要があります。ノードを削除すると、バランス係数は+/- 1になり、回転は発生しません。
- したがって、ノードが4つ未満のツリーから削除しても、ローテーションは発生しません。
削除時に1回転が発生する最小のサブツリーは、高さが3の4ノードです。短辺のノードを削除すると、回転が発生します。同様に、ルートノードを削除し、短辺のノードを置き換えとして使用すると、ローテーションが発生します。ツリーがどのように構成されているかは関係ありません。
B B Removal of A or replacement of B with A
/ \ / \ results in rotation. No rotation occurs
A C A D on removal of C or D, or on replacement
\ / of B with C.
D C
C C Removal of D or replacement of C with D
/ \ / \ results in rotation. No rotation occurs
B D A D on removal of A or B, or on replacement
/ \ of C with B.
A B
4ノードツリーから削除すると、高さ2のバランスの取れたツリーになります。
.
/ \
. .
2番目の回転を実行するには、ターゲットツリーの兄弟の高さが4である必要があります。これにより、ルートのバランス係数は+/- 1になります(したがって、高さは5になります)。影響を受けるツリーが親の右側にあるか左側にあるかは関係ありません。また、兄弟ツリーのレイアウトも重要ではありません(つまり、H4のH3の子は左側または右側にあり、次のいずれかになります。上記の4つの向きですが、H2の子は2つの可能な向きのいずれかになります-これは証明する必要があります)。
_._ _._
/ \ / \
(H4) . . (H4)
/ \ / \
. . . .
\ \
. .
3番目のローテーションでは、影響を受けるツリーの祖父母が同様に+/- 1だけ不均衡である必要があり、4番目のローテーションでは曽祖父母が+/-1だけ不均衡である必要があることは明らかです。
定義上、サブツリーの高さは、各ブランチの最大の高さにルートの1を加えたものです。ルートで+/-1の不均衡を実現するには、一方の兄弟の身長をもう一方の兄弟より1高くする必要があります。
H(1) = 3 (as observed above)
H(k) = 1 + max(H(k - 1), H(k - 1) + 1)) = 1 + H(k - 1) + 1 = H(k - 1) + 2
... Inductive proof leading to H(k) = 2k + 1 eludes me.
最小ノード
当然の結果
- 大きなツリーでは、ノードの最小数が必ずしも最大であるとは限りません。ウィットに:
次のツリーからAを削除し、回転しても高さが変わらないことを確認します。したがって、親のバランス係数は変更されず、追加のローテーションは発生しません。
B B D
/ \ \ / \
A D => D => B E
/ \ / \ \
C E C E C
ただし、k = 2の場合、ここでH(4)が最小化されているかどうかは関係ありません。2番目の回転は引き続き発生します。
_._ _._
/ \ / \
(H4) . . (H4)
/ \ / \
. . . .
\ \
. .
質問
- ターゲットサブツリーの位置は何ですか?明らかに、k = 1の場合はルートであり、k = 2の場合、ルートのバランス係数が-1の場合は左、それ以外の場合は右です。k> = 3の位置を決定するための式はありますか?
- k回転を実行するためにツリーに含めることができる最大ノードはいくつですか?親がローテーションされていても、ローテーションされていない中間ノードを祖先に持つことは可能ですか?