一、紅黑樹的介紹
算法導論對紅黑樹的介紹:
紅黑樹,一種二叉查找樹,但在每個結點上增加一個存儲位表示結點的顏色,可以是Red或Black。
通過對任何一條從根到葉子的路徑上各個結點着色方式的限制,紅黑樹確保沒有一條路徑會比其他路徑長出倆倍,因而是接近平衡的
二、紅黑樹的性質
- 每個結點要麼是紅的,要麼是黑的。
- 根結點是黑的
- 定義NULL爲黑色
- 如果某個子結點是紅色的,那麼它的兩個兒子都是黑色的,且父結點也必定是黑色的。
- 對於任一個結點而言,它到葉結點的每一條路徑都包含相同數目的黑色結點,稱爲黑高(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,繼續調整。
紅黑樹的插入調整:
- 考慮到左子樹的情況,規定如下標記
- 正在處理的結點X,也叫子結點
- 父結點P
- 爺爺結點G
- 叔叔結點Y
- A3表示黑高爲3的紅黑樹
- 無需調整的情況爲:
- X爲根結點,將X由紅染黑,簡稱rootOver
- 父節點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--,需要調整
- 考慮到刪除左子樹的情況,規定如下標記:
- 正在處理的結點X
- 父結點P
- 兄弟結點sib,簡稱S
- 左侄leftNephew,簡稱LN
- 右侄rightNephew,簡稱RN
- 紅黑樹的刪除調整
- 需要刪除的結點X爲紅色,直接刪除X
- 其他無需調整的情況爲:
- 當前X爲根節點,無論root什麼顏色,都將root染黑,rootOver
- 當前X爲紅色,將X染黑,結束,redOve
- 刪除左孩子X,分爲四種情況:
- case1:S爲紅色;S染黑;P染紅,左旋P
- case2:S爲黑色;黑LN,黑RN;S染紅,X回溯到P
- case3:S爲黑色;紅LN,黑RN;LN染黑,S染紅,右旋S
- case4:黑S,LN隨意,紅RN;S變P的顏色,P和S染黑,左旋P
- 刪除的X本身就是紅色節點,直接刪除
- 無需調整2
- 回溯指針時遇到的情況:
- X爲根節點,無論root什麼顏色,都將root染黑,將根節點染黑同時滿足2、4、5,簡稱rootOver
- 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
- 條件:S爲黑色,P可紅可黑,RN爲黑色