本文承接前三篇紅黑樹系列,採用「宏觀總結 → 統一符號 → 分情況圖解 → 代碼對照」四層結構,誓要讓你對紅黑樹插入/刪除修復的每一種情況都能看到圖、讀懂碼、寫出來。
(同前文,此處不贅述)關鍵區分:
修改層:RB-INSERT/RB-DELETE(純BST邏輯)
修復層:RB-INSERT-FIXUP/RB-DELETE-FIXUP(變色+旋轉)
| 符號 | 含義 | 代碼獲取 |
|---|---|---|
| N | 新插入/當前檢查節點 | node n |
| P | 父節點 | n->parent |
| G | 祖父節點 | n->parent->parent |
| U | 叔叔節點 | grandparent(n)->right/left |
| S | 兄弟節點 | sibling(n) |

void insert_case1(node n) {
if (n->parent == NULL) n->color = BLACK;
else insert_case2(n);
}

void insert_case2(node n) {
if (n->parent->color == BLACK) return; // 已滿足性質
else insert_case3(n);
}
void insert_case3(node n) {
if (uncle(n) && uncle(n)->color == RED) {
n->parent->color = BLACK;
uncle(n)->color = BLACK;
grandparent(n)->color = RED;
insert_case1(grandparent(n)); // 遞歸向上
} else insert_case4(n);
}

void insert_case4(node n) {
if (n == n->parent->right && n->parent == grandparent(n)->left) {
rotate_left(n->parent);
n = n->left;
} else if (n == n->parent->left && n->parent == grandparent(n)->right) {
rotate_right(n->parent);
n = n->right;
}
insert_case5(n); // 必進入情形5
}

void insert_case5(node n) {
n->parent->color = BLACK;
grandparent(n)->color = RED;
if (n == n->parent->left && n->parent == grandparent(n)->left)
rotate_right(grandparent(n));
else
rotate_left(grandparent(n)); // 鏡像情況
}

符號:x為「雙重黑」傳遞節點,w = sibling(x)為兄弟節點。
動作:父變紅、w變黑、對父旋轉(方向視x是左/右孩子)→ 轉化為情況2/3/4。
本質:紅兄弟旋轉後變黑,為後續處理創造黑兄弟前提。

動作:w變紅、x ← 父節點向上傳遞雙重黑。
本質:從兄弟「借」一個黑高給父路徑,自己變紅補償。

動作:w左孩子變黑、w變紅、對w右旋 → 轉化為情況4。

動作:w繼承父顏色、父變黑、w右孩子變黑、對父左旋 → 修復結束。
本質:一次旋轉+三次變色,完美平衡黑高,雙重黑消除。

insert_case1~5與delete_case1~4,編譯運行測試隨機序列。掌握這九種情況(插入5+刪除4),紅黑樹核心算法便真正收入囊中。