給定二元樹,插入序列為 [X, I, S, K, M, A]。樹的結構如下:
X
/ \
S I
\
K
/ \
M A
💡 說明:根節點為 X;X 的左小孩是 S、右小孩是 I;S 的右小孩是 K(S 的左小孩為空);K 的左小孩是 M、右小孩是 A。
X, S, K, M, A, I
順序口訣:中、左、右(Root, Left, Right)。
M, A, K, S, I, X
順序口訣:左、右、中(Left, Right, Root)。
使用陣列表示法,從 Index 0 開始;若無節點請填 null。
核心公式 若父節點在索引 p,則:
左小孩位置 = 2p + 1
右小孩位置 = 2p + 2
| Index | Content | 計算過程備註 |
|---|---|---|
| 0 | X | Root 節點 |
| 1 | S | X 的左小孩 (2*0 + 1) |
| 2 | I | X 的右小孩 (2*0 + 2) |
| 3 | null | S 的左小孩為空 |
| 4 | K | S 的右小孩 (2*1 + 2) |
| 5 | null | I 的左小孩為空 |
| 6 | null | I 的右小孩為空 |
| 7 | null | (Index 3) 的左小孩為空 |
| 8 | null | (Index 3) 的右小孩為空 |
| 9 | M | K 的左小孩 (2*4 + 1) |
| 10 | A | K 的右小孩 (2*4 + 2) |
插入序列:[5, 8, 27, 16, 11, 13]。以下逐步說明每次插入、何時失衡以及採用的旋轉。
5
樹只有一個節點,平衡。
5
\
8
仍然平衡(高度差 ≤ 1)。
5
\
8
\
27
🚨 失衡發生:節點 5 出現 Right-Right (RR) 失衡(右子樹連續偏右)。
✅ 解決方法:在節點 5 上做 Left Rotation (左旋轉),結果如下:
8
/ \
5 27
8
/ \
5 27
/
16
插入 16 為 27 的左子節點,整體高度差符合規範,仍然平衡。
8
/ \
5 27
/
16
/
11
🚨 失衡發生:節點 27 出現 Left-Left (LL) 失衡(左子樹連續偏左)。
✅ 解決方法:對節點 27 做 Right Rotation (右旋轉),結果局部調整為:
8
/ \
5 16
/ \
11 27
8
/ \
5 16
/ \
11 27
\
13
🚨 失衡發生:向上檢查時,根節點 8 的平衡因子變為 -2(右側過高)。因為新節點 13 插入在 8 的右子(16)的左側(11的右側),這是典型的 Right-Left (RL) 失衡。
✅ 解決方法:標準 雙旋轉 (Double Rotation)。先對 16 做右旋,再對 8 做左旋。執行後最終樹為:
11
/ \
8 16
/ / \
5 13 27
核心理由:
2p+1 公式會大亂!