1. 程式人生 > >紅黑樹的添加與刪除

紅黑樹的添加與刪除

tps 根節點 位置 runjs insert cas 高度 spl 結點

主脈絡參考http://www.cnblogs.com/skywang12345/p/3245399.html#!comments

補圖刪除操作:https://blog.csdn.net/eson_15/article/details/51144079

R-B Tree的在線生成:http://sandbox.runjs.cn/show/2nngvn8w

數據結構與算法匯總:http://www.cnblogs.com/skywang12345/p/3603935.html

紅黑樹 R-B Tree

1、紅黑樹的時間復雜度與特性
  1.1 特性:
    (1):每個節點不是黑色就是紅色;
    (2):根節點是黑色
    (3):葉子結點(為空的葉子節點)是黑色
    (4):若一個節點是紅色,則其子節點必為黑色,反之不成立
    (5):從一個節點到該節點的子孫節點的所有路徑上有相同數目的黑節點。
1.2 時間復雜度:
  (1):紅黑樹的時間復雜度是O(logn)。
  (2):一顆含有n個節點的紅黑樹的高度至多為2*log(n+1);

2、左旋與右旋(旋轉前後仍然是二叉查找樹)
  2.1:對x節點左旋:被旋轉的節點成為一個左節點;
  2.2:對x節點右旋:被旋轉節點成為一個右節點; 

技術分享圖片
                               z
   x                          /                  
  / \      --(左旋)-->  x
 y   z                      /
                           y
------------------------------------
                              y
   x                            \                 
  
/ \ --(右旋)--> x y z z
View Code

3、紅黑樹基本操作--添加

  3.1:RB-Insert:
    找到該節點的插入位置y,並將其染成紅色
  3.2:RB-Insert-FixUp
    3.2.1:被插入節點是根節點:著黑;
    3.2.2:被插入節點父節點是黑色,直接插入
    3.2.3:被插入節點父節點是紅色
      case1:父節點紅,叔叔節點紅:
        (1):父節點、叔叔節點設為黑
        (2):祖父節點設為紅
        (3):以祖父節點為當前節點,再判斷;

技術分享圖片

      case2:父節點紅,叔叔節點黑,插入節點是右孩子;

        (1):以父節點為當前節點
        (2):左旋,再判斷;

技術分享圖片

      case3:父節點紅,叔叔節點黑,插入節點是左孩子:

        (1):父節點設為黑;
        (2):祖父節點設為紅;
        (3):以祖父節點為支點右旋;

技術分享圖片


4、紅黑樹的基本操作--刪除
  4.1:RB-delete:
    (將後繼節點設置為與刪除節點相同的顏色,這樣只處理後繼節點原位置處的平衡)
    4.1.1:被刪除節點沒有兒子,直接刪除;
    4.1.2:被刪除節點只有一個兒子,直接刪除,唯一子節點頂替;
    4.1.3:被刪除節點有兩個兒子:找右孩子的左孩子,一直找下去(二叉搜索樹的刪除)。
  4.2:RB-Delete-FixUP:
    4.2.1:x為黑,兄弟節點是紅(父節點和兄弟的字節點是黑);
      (1)父節點設紅,兄弟設黑,父節點左旋;

技術分享圖片技術分享圖片

    4.2.4:x為黑,兄弟節點是黑:
      case1:兄弟兩個子節點都是黑:
        (1):兄弟節點設紅;
        (2):當前節點更新為祖父節點;

技術分享圖片技術分享圖片

      case2:兄弟左節點是紅,右節點是黑
        (1):兄弟節點設紅,兄弟左子節點設黑;
        (2):以兄弟節點作右旋;

技術分享圖片技術分享圖片

      case3:兄弟左節點任意,右節點是紅:

        (1):兄弟節點設為父節點顏色;
        (2):父節點設黑,兄弟右節點設黑;
        (3):以父節點為支點左旋;
技術分享圖片技術分享圖片

5:Java實現:


紅黑樹的添加與刪除