紅黑樹作為自平衡二元搜尋樹,維持以下五大性質確保操作複雜度為 O(log n):
typedef enum { RED = 0, BLACK = 1 } color_t;
typedef struct rb_node_t {
struct rb_node_t *left, *right, *parent;
key_t key;
data_t data;
color_t color;
} rb_node_t;
rb_insert:插入節點並透過 rb_insert_rebalance 維持平衡rb_search:標準二元搜尋樹查找rb_erase:刪除節點並透過 rb_erase_rebalance 修復紅黑性質rb_rotate_left/right:左右旋轉基礎操作新節點標記為紅,若父節點也為紅則違反性質 4,需分情況處理:
父、叔改黑,祖父改紅,將祖父作為新檢查節點繼續向上處理。
先對父節點進行相反方向旋轉轉化為情況 3。
父改黑、祖父改紅、對祖父進行同方向旋轉,修正完成。
刪除黑節點會導致路徑黑高減少,需從被刪節點的子節點開始向上修正:
將「雙重黑」問題向上傳遞,透過兄弟節點顏色及其子節點顏色分情況旋轉重新著色,直到節點變紅或到達根節點。
程式採用 GetRdm(min, max) 宏生成偽隨機數,並每 32768 次呼叫 srand(time(NULL)) 重置種子,試圖緩解 rand() 週期短的問題。實際測試插入 1000 萬筆資料,並與 std::map 交叉驗證正確性。
std::map,檢測鍵值一致性std::map 驗證紅黑樹查找結果useCount 計數器)std::mt19937 或系統熵源本程式提供了教學級別的紅黑樹完整 C 實現,適合演算法學習參考。工程應用建議直接使用 std::map/std::set 或成熟庫(如 Linux 核心 rbtree.h),避免重複造輪子引入風險。