紅黑樹的基本性質(共四篇)

1.什麼是紅黑樹

  我們知道一棵高度爲h的二叉搜索樹的大部分操作時間複雜度是O(h),但是如果搜索樹較高,極端情況下就是一條鏈表了,二叉搜索的意義就不大了。而紅黑樹是一顆二叉搜索樹,也是多種平衡搜索樹的一種,可以保證最壞情況下時間複雜度爲O(lgn)。對於一棵有n個內部節點的紅黑樹的高度最多爲2lg(n+1),高度的證明不難,請參考算法導論。
 

2.紅黑樹的五大性質

  這五大性質非常重要,想要明白紅黑樹,這五個性質請大家必須牢記。一棵紅黑樹是滿足下面紅黑性質的二叉搜索樹:

1. 每個節點或是紅色的,或是黑色的

2. 根節點是黑色的

3.每個葉節點(NIL)是黑色的

4.如果一個節點是紅色的,則它的兩個子節點都是黑色的

5.對於每個幾點,從該節點到其所有後代葉節點的簡單路徑上,均包含相同數目的黑色節點。

關於性質一,第一眼看着好像就是廢話沒啥用,其實到了後面刪除操作的時候就看出這個性質是很微妙的。這裏還有兩個概念,一個是哨兵節點,爲了方便處理邊界條件以及方便描述,我們把不需要關注的葉子節點和null節點統一用一個特殊節點表示,我們稱它爲哨兵節點,記爲T.NIL。一個是黑高,從某個節點x出發(不含該節點)達到一個葉節點的任意一條簡單路徑上的黑色節點個數稱爲該節點的黑高。下面展示一棵普通的紅黑樹:

 

3.旋轉操作

   在紅黑樹進行新增節點或者刪除節點的時候,有可能改變了紅黑樹的五大性質,所以我們需要對紅黑樹進行調整,左旋轉(LEFT-ROTATE)和右旋轉(RIGHT-ROTATE)是極其重要的兩個操作。通過旋轉和調整顏色可以恢復紅黑樹的五大性質。如下圖所示,右旋轉a節點會以a爲中心,把它的左孩子b旋轉爲樹根,然後把左孩子b的右孩子作爲a的左孩子。右旋轉則剛剛好相反。
 下面展示左旋轉僞代碼(抄自算法導論,右旋轉類似不列出)
// 以節點b爲中心左旋轉
LEFT-ROTATE(T, b)
  a = b.right;
  // 把右孩子a的左孩子給節點b做右孩子
  b.right = a.left;
  if a.left != T.NIL
     a.left.p = b;
  a.p = b.p;
  if b.p == T.NIL
     T.rooot = a;
  else if b == b.p.left
      b.p.left = a;
  else b.p.right = a;
  a.left = b;
  b.p = a;
 

4.子樹移植

     紅黑樹的移植在刪除中需要用到,被刪除的節點的子樹將要代替被刪除的節點
//用以v爲根的子樹替代以U爲根的子樹  
RB-TRANSPLANT(T, u, v): 
    if(u.p == T.NIL)  
        T.ROOT = v  
    else if u == u.p.left
        u.p.left = v  
    else u.p.right = v  
    v.parent=u.parent  
 

5.找出最小節點

  紅黑樹刪除的時候需要用到,如果被刪除節點有雙非空子樹,找出該節點的後繼節點
TREE-MINIMUM(x)
  while x.left != T.NIL
    x = x.left;
  return x;


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章