AVL 木の回転 — 単回転と二重回転の解説
AVL 木が4種類の回転(左回転、右回転、左右回転、右左回転)を通じてバランスを維持する方法を視覚的な図解で学びます。
Balancing
詳細な説明
AVL 木の回転
AVL 木は挿入または削除により左右の部分木の高さの差が 1 を超えた場合に回転を実行してバランスを維持します。4つの回転ケースがあります。
バランスファクター
ノードのバランスファクター:BF(node) = height(left) - height(right)
- BF = -1, 0, 1 — バランスしている(回転不要)
- BF > 1 — 左に重い(右回転または左右回転が必要)
- BF < -1 — 右に重い(左回転または右左回転が必要)
ケース 1:右回転(Left-Left ケース)
ノードが左に重く、その左の子も左に重い場合:
回転前(BF=2): 右回転後:
30 20
/ / \
20 10 30
/
10
ケース 2:左回転(Right-Right ケース)
右回転のミラー:
回転前(BF=-2): 左回転後:
10 20
\ / \
20 10 30
\
30
ケース 3:左右回転(Left-Right ケース)
ノードが左に重いが左の子が右に重い — 2回の回転が必要:
回転前: 左回転(10)後: 右回転(30)後:
30 30 20
/ / / \
10 20 10 30
\ /
20 10
ケース 4:右左回転(Right-Left ケース)
左右のミラーです。
計算量
各回転は O(1) 時間 — 一定数のポインタのみを再配置します。挿入後は最大 1 回の回転(単または二重)が必要です。削除後、回転はルートまで伝播する可能性がありますが、合計では O(log n) です。
ユースケース
AVL 回転は自己平衡木を理解するための基礎です。コーディング面接(AVL 木の実装)、データベース内部(B-tree の再平衡は同様の概念を使用)、コンパイラ構築(平衡構文解析木)に現れます。回転の概念は Red-Black 木、Treap、Splay 木にも拡張されます。