理解紅黑樹之JDK源碼應用

一、紅黑樹的介紹

算法導論對紅黑樹的介紹:

紅黑樹,一種二叉查找樹,但在每個結點上增加一個存儲位表示結點的顏色,可以是Red或Black。
通過對任何一條從根到葉子的路徑上各個結點着色方式的限制,紅黑樹確保沒有一條路徑會比其他路徑長出倆倍,因而是接近平衡的

二、紅黑樹的性質

  1. 每個結點要麼是紅的,要麼是黑的。
  2. 根結點是黑的
  3. 定義NULL爲黑色
  4. 如果某個子結點是紅色的,那麼它的兩個兒子都是黑色的,且父結點也必定是黑色的。
  5. 對於任一個結點而言,它到葉結點的每一條路徑都包含相同數目的黑色結點,稱爲黑高(BlackHight、BH)。

    正是紅黑樹的這5條性質,使一棵n個結點的紅黑樹始終保持了logn的高度。N個結點的RBT,最大高度是2log(N+1)

    若H(left)>=H(right),則H(left)<=2*H(right)+1 但 BH(right) == BH(left)。

三、紅黑樹的旋轉和變色。

    當對紅黑樹進行刪除和插入操作時,就會對樹的結構造成修改,從而會破壞紅黑樹的性質,所以當我們對紅黑樹進行刪除或者插入操作時需要,調整樹的結構使紅黑樹的性質不被破壞,可以通過對結點進行重新着色,以及對樹進行相關的旋轉操作,即通過修改樹中某些結點的顏色及指針結構。

   1、旋轉:

     

算法導論的代碼:

LeftRoate(T, x)
y ← x.right				       //定義y:y是x的右孩子
x.right ← y.left	            //y的左孩子成爲x的右孩子
if y.left ≠ T.nil
    y.left.p ← x	
y.p ← x.p				       //x的父結點成爲y的父結點
if x.p = T.nil
	then T.root ← y
else if x = x.p.left
	then x.p.left ← y
else x.p.right ← y 
y.left ← x                       //x作爲y的左孩子
x.p ← y

四、紅黑樹的插入

      插入原則:若插入的結點爲黑色,則肯定違反性質5,則只能插入紅色結點,可能違反性質4,繼續調整。

     紅黑樹的插入調整:

  • 考慮到左子樹的情況,規定如下標記
  1. 正在處理的結點X,也叫子結點
  2. 父結點P
  3. 爺爺結點G
  4. 叔叔結點Y
  5. A3表示黑高爲3的紅黑樹

  •   無需調整的情況爲:
  1. X爲根結點,將X由紅染黑,簡稱rootOver
  2. 父節點P爲黑色,BlackParentOver,簡稱bpOver
  •    僅僅需要考慮父節點P爲紅色的情形,由於性質4,爺爺結點G必定是黑色,分爲三種情況:
    • case1:Y爲紅色,X可左可右;P、Y染黑,G染紅,X回溯至G
    • case2:Y爲黑色,X爲右孩子;左旋P,X指向P,轉化爲case3
    • case3:Y爲黑色,X爲左孩子;P染黑,G染紅,右旋G,結束
  • 結論:RBT的插入調整最多旋轉2次。
  • 先看一下無需調整的JDK源碼:
    • 越界,X是根節點,父節點P的顏色爲黑,必定滿足性質4

             最後一步:將根節點root染黑

  • case1的源碼
    • 條件:P爲G的左孩子,Y爲紅色,X可左可右
    • 處理方式:P、Y染黑,G染紅,X回溯之G
  • case2的源碼
    • 條件:P爲G的左孩子,Y爲黑色,X爲右孩子
    • 處理方式:右旋P,X指向P,轉化爲case3
  • case3的源碼
    • 條件:P爲G的左孩子,Y爲黑色,X爲左孩子
    • 處理方式:P染黑,G染紅,左旋G,結束

 

五、紅黑樹的刪除

      刪除原則:刪除紅色結點,不會影響BH,也不會違反性質4,無需調整

     刪除黑色結點,結點所在子樹的BH--,需要調整

  • 考慮到刪除左子樹的情況,規定如下標記:
    1. 正在處理的結點X
    2. 父結點P
    3. 兄弟結點sib,簡稱S
    4. 左侄leftNephew,簡稱LN
    5. 右侄rightNephew,簡稱RN

  • 紅黑樹的刪除調整
    • 需要刪除的結點X爲紅色,直接刪除X
    • 其他無需調整的情況爲:
      1. 當前X爲根節點,無論root什麼顏色,都將root染黑,rootOver
      2. 當前X爲紅色,將X染黑,結束,redOve 
    • 刪除左孩子X,分爲四種情況:
      1. case1:S爲紅色;S染黑;P染紅,左旋P
      2. case2:S爲黑色;黑LN,黑RN;S染紅,X回溯到P
      3. case3:S爲黑色;紅LN,黑RN;LN染黑,S染紅,右旋S
      4. case4:黑S,LN隨意,紅RN;S變P的顏色,P和S染黑,左旋P
  • 刪除的X本身就是紅色節點,直接刪除
  • 無需調整2
    • 回溯指針時遇到的情況:
      1. X爲根節點,無論root什麼顏色,都將root染黑,將根節點染黑同時滿足2、4、5,簡稱rootOver
      2. X爲紅色,將X染黑,簡稱redOver
  • case1源碼
    • 條件:S爲紅色
    • 由於性質4,P、LN、RN必定都爲黑色
    • 處理方式:S染黑,P染紅,左旋P,LN成爲新的sib
  • case2源碼:
    • 條件:S、LN、RN均爲黑色,P爲紅色或者黑色
    • 處理方式:S染紅,X回溯至P
  • case3源碼:
    • 條件:S爲黑色,LN爲紅色,RN爲黑色
    • 處理方式:LN染黑、S染紅、右旋S,S指向LN轉化爲case4
  • case4源碼:
    • 條件:S爲黑色,P可紅可黑,RN爲黑色
      • 處理方式:S的顏色設置爲與P相同,P染黑,RN染黑,左旋P,X指向根節點,rootOver
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章