首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 紅黑樹原理詳解(上):五大性質、插入修復、刪除修復與旋轉圖解

     編輯:關於C#

紅黑樹定義與五大性質

紅黑樹是自平衡二元搜尋樹,每個節點標記紅/黑,滿足:

  1. 節點非紅即黑。
  2. 根節點為黑。
  3. 葉節點(NIL/哨兵)為黑。
  4. 紅節點的子節點必為黑(無連續紅)。
  5. 任一節點到其所有葉節點的路徑,黑節點數相同(黑高度一致)。

黑哨兵示意圖

第 3 點引入黑哨兵,確保性質 5 能在所有路徑一致計算。

旋轉操作(同 AVL)

  • LL(右旋)、RR(左旋)、LR(左後右)、RL(右後左)
  • 旋轉後更新顏色而非平衡因子

旋轉示意

插入修復流程

新節點預設 紅(插入黑會破壞黑高度)。

案例 1:父節點為黑 → 直接完成

黑父完成

案例 2:父節點為紅 → 祖必為黑,視叔節點顏色分類

紅父判定點

2.1 叔節點為紅 → 重新著色,向上繼續

  • 父、叔 → 黑
  • 祖 → 紅
  • 以祖為新判定點繼續向上檢查

紅叔重著色

2.2 叔節點為黑/不存在 → 旋轉修復(4 種幾何形態)

  • LL:新-父-祖皆左傾 → 右旋祖
  • LR:新右、父左、祖左 → 左旋父、右旋祖
  • RR:皆右傾 → 左旋祖
  • RL:新左、父右、祖右 → 右旋父、左旋祖

旋轉後:新根變黑、祖變紅,修復結束無需向上。

LL旋轉 LR旋轉 RL旋轉 RR旋轉

刪除修復流程

  1. 標準 BST 刪除:雙子節點用中序前驅取代,實際刪除節點最多一子。
  2. 實際刪除節點 old,取代節點 new。

情況 1:old 為紅 → 必為葉,直接刪除

刪除紅葉

情況 2:一紅一黑 → new 染黑即可

一紅一黑

情況 3:雙黑(old 黑、new 黑/無) → 複雜回溯

依兄弟節點顏色分類:

3.1 紅兄 → LL/RR 旋轉,父變紅、兄變黑,判定點下降一層轉為黑兄

紅兄旋轉

3.2 黑兄 → 視姪節點與父顏色

  • 二黑姪、紅父:父→黑、兄→紅、new→黑,結束。
  • 二黑姪、黑父:父→new顏色、new→黑、兄→紅,判定點上移繼續。
  • 紅姪:4 種幾何形態(LL/LR/RR/RL)旋轉,旋轉後新根繼承父色、父變黑、對應姪變黑,結束。

二黑姪紅父 二黑姪黑父 紅姪情形1 紅姪情形2 紅姪情形3 紅姪情形4

實作註記

  • BCL TreeSet 採用「下沉式」預先旋轉/著色,避免回溯,但未命中時有額外開銷。
  • 本系列採用「路徑棧回溯」法,邏輯清晰、易除錯,效能接近 BCL。
  • Silverlight 動畫展示插入/刪除過程(需安裝 Silverlight 2.0)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved