typedef enum { RED, BLACK } color;
typedef struct _redblack {
color m_color;
int m_data;
struct _redblack *parent, *left, *right;
} redblack;
typedef struct _wrapdata {
redblack *root;
int size;
} wrapdata;
新節點標紅 → 父節點若紅則違反性質 → 根據叔節點顏色與 LL/LR/RL/RR 四種情況旋轉+重新著色。
刪除節點後可能破壞黑高平衡 → 根據兄弟節點顏色與姪節點情況,分 mode=0(刪左子)與 mode=1(刪右子)兩條對稱邏輯,透過旋轉與重新著色恢復性質。
check():遞迴驗證 BST 有序性、父指標正確性mid_print():中序列印並統計節點數,對比 sizedepth():計算樹高,觀察平衡度int main() {
init_memory_pool();
wrapdata *tree = calloc(1, sizeof(wrapdata));
srand(time(NULL));
while (1) {
// 插入階段
while (tree->size < COUNT) {
insert(tree, rand() % RAND);
if (check(tree->root) || mid_print(tree->root,0) != tree->size) return 1;
}
// 刪除階段
while (tree->size > COUNT/2) {
delete(tree, rand() % RAND);
if (check(tree->root) || mid_print(tree->root,0) != tree->size) return 1;
}
}
}
gcc rbtree.c -o rbtree && ./rbtree
程式會持續運行,若無輸出錯誤訊息即通過測試。可觀察 COUNT*2/3 節點時的樹高,驗證 O(log n) 特性。
作者:chenbingchenbing