一、為什么需要旋轉?
在紅黑樹中,插入或刪除節點可能會破壞其五條性質,比如高度不平衡或連續紅節點。
為了恢復紅黑性質,我們采用局部旋轉來“調整樹形結構”,保持平衡。
二、旋轉本質是“局部變形”
- 左旋和右旋不會破壞中序遍歷結果(即元素仍是有序的)
- 旋轉只是在三到四個節點之間調整指針結構
三、🔄 左旋(Left Rotation)
目的:把某個節點往上提,把右子節點放下來
對節點 x
做左旋,即把 x
的右子節點 y
轉換為其父節點,y
的左子樹轉為 x
的右子樹。
? 前提:
- 節點
x
有一個右子節點y
📌 結構變化圖:
原始結構: 旋轉后結構:x y
\ /
y --> x
/ \
T1 T1
🔧 偽代碼(C++ 風格):
Node* leftRotate(Node* x) {Node* y = x->right;x->right = y->left;if (y->left) y->left->parent = x;y->parent = x->parent;if (!x->parent) root = y;else if (x == x->parent->left) x->parent->left = y;else x->parent->right = y;y->left = x;x->parent = y;return y;
}
四、🔁 右旋(Right Rotation)
目的:把某個節點往上提,把左子節點放下來
對節點 y
做右旋,即把 y
的左子節點 x
轉換為其父節點,x
的右子樹轉為 y
的左子樹。
? 前提:
- 節點
y
有一個左子節點x
📌 結構變化圖:
原始結構: 旋轉后結構:y x
/ \
x --> y
\ /
T1 T1
🔧 偽代碼(C++ 風格):
Node* rightRotate(Node* y) {Node* x = y->left;y->left = x->right;if (x->right) x->right->parent = y;x->parent = y->parent;if (!y->parent) root = x;else if (y == y->parent->left) y->parent->left = x;else y->parent->right = x;x->right = y;y->parent = x;return x;
}
五、動手建議
手動畫出下面結構并旋轉:
10\20\30
此時你對 10 進行左旋,會得到:
20/ \10 30
六、應用場景提示
- 左旋和右旋是紅黑樹維護性質的唯一“結構性操作”
- 接下來我們講:插入時的三種情況 + 旋轉修復方式
? 小測試
- 紅黑樹為什么旋轉后仍能保持 BST 的性質?
- 左旋后,原節點的右子節點發生了什么變化?
- 紅黑樹旋轉是否會破壞紅黑性質?