紅黑樹是一種自平衡二叉搜尋樹,廣泛應用於 C++ STL(`std::map`、`std::set` 等)、Linux 核心調度器、Nginx、Java `TreeMap` 等關鍵基礎設施。本文整理紅黑樹核心性質、C 語言完整實現(頭文件、源文件、測試用例),並說明關鍵操作邏輯,適合需要深入理解或移植自平衡樹的開發者。
由此可證:高度 ≤ 2·log₂(n+1),保證查找、插入、刪除最壞情況 O(log n)。
typedef enum { RED, BLACK } Color;
typedef struct RBNode {
void *key; // 鍵值(由比較函數決定順序)
void *value; // 衛星數據
struct RBNode *left, *right, *parent;
Color color;
} RBNode;
typedef struct {
RBNode *root;
RBNode *nil; // 哨兵節點,統一處理邊界
int (*compare)(const void *, const void *); // 比較函數指標
void (*free_key)(void *); // 可選:釋放鍵記憶體
void (*free_val)(void *); // 可選:釋放值記憶體
} RBTree;
旋轉是維持平衡的核心原語,只改變指標指向,O(1) 完成。
// 左旋:x 為旋轉支點,y = x->right
void rb_rotate_left(RBTree *T, RBNode *x) {
RBNode *y = x->right;
x->right = y->left;
if (y->left != T->nil) y->left->parent = x;
y->parent = x->parent;
if (x->parent == T->nil) T->root = y;
else if (x == x->parent->left) x->parent->left = y;
else x->parent->right = y;
y->left = x;
x->parent = y;
}
右旋對稱實現。
新節點標紅,可能違反性質 4。透過「叔節點顏色判斷 + 旋轉」三種 Case 修正:
刪除節點後可能違反性質 5(黑高不一致)。引入「雙重黑」概念,四種 Case 處理:
red_black_tree.h:介面宣告、結構體、API 原型red_black_tree.c:所有操作實現(init、insert、delete、find、traverse、destroy)rbtree_test.c:測試用例(隨機插入/刪除、驗證性質、效能基準)編譯方式:
gcc -std=c99 -Wall -O2 red_black_tree.c rbtree_test.c -o rbtree_test
./rbtree_test