數據結構與算法(十二) 紅黑樹

紅黑樹

在閱讀紅黑樹以前要弄明白B樹,作到想到紅黑樹,心中有B樹。沒有弄明白的能夠看我上一個文章

數據結構與算法(十一) 紅黑樹算法

紅黑樹例子

紅黑樹也是一種自平衡二叉搜索樹數據結構

之前也叫作平衡二叉B樹post

紅黑樹必須知足一下5個性質性能

  • 節點是有顏色的Red/Black
  • 根節點必須是Black
  • 葉子節點必須是Black
    • 紅黑樹的葉子節點會自動將度爲0 或者度爲1的節點的度自動補充爲2,補充的節點稱之爲外部節點
      • 外部節點是空想出來的,代碼中不會實現
  • red節點的子節點都是black
  • 從任意一節點到葉子節點的全部路徑包含的black節點數目相同
    • 這裏說的葉子節點包含假想出來的葉子節點

1、判斷下面是否爲紅黑樹

判斷是否爲紅黑樹

  • 不是3d

    知足code

    • 節點是有顏色的Red/Black
    • 根節點必須是Black
    • 葉子節點必須是Black
      • 紅黑樹的葉子節點會自動將度爲0 或者度爲1的節點的度自動補充爲2,補充的節點稱之爲外部節點
        • 外部節點是空想出來的,代碼中不會實現
    • red節點的子節點都是black
  • 不知足cdn

    • 從任意一節點到葉子節點的全部路徑包含的black節點數目相同

解釋不是紅黑樹

2、紅黑樹的等價變換

紅黑樹的等價變換

  • 紅黑樹和4階B樹具備等價性blog

    • Black節點與他的Red子節點融合在一塊兒,就造成一個B樹節點
  • 紅黑樹的Black節點個數與4階B樹的節點總數相等繼承

3、紅黑樹的操做

一、添加

  • 想像成4階B樹
    • 添加操做都在葉子節點中。
    • 4階B樹全部節點的元素個數爲 1 <= x <= 3
  • 建議新添加的節點默認爲Red (這樣能更快的知足紅黑樹的性質)。
  • 根節點默認爲Black

全部的添加狀況以下圖所示遞歸

添加時全部的狀況

添加狀況處理:

a、當parent爲black的狀況,直接添加,無需特殊處理。(4種狀況)
b、當parent爲Red的狀況。有如下幾種狀況(8種)
一、當uncle節點爲Black
  • RR/LL狀況

    • 先對parent染成黑色,在對grand染紅(染色的意義是在與讓後面旋轉後parent的節點爲黑色,parent的子節點爲黑色)
    • 當RR/LL狀況的時候,須要對其進行左旋轉/右旋轉。(grand變成parent的子節點)。
  • LR\RL狀況

    • 將本身染成Black,grand染成Red 。(染色的意義是進行後面的雙旋轉操做後本身成爲parent節點,規定partent的節點爲黑色,parent的子節點(原來的parent和grand)爲Red。)。
    • 進行雙旋轉
      • LR:parent左旋轉,grand右旋轉。
      • RL:parent右旋轉,grand左旋轉。
二、當uncle節點爲Red

當uncle爲Red的時候,紅黑樹對比4階B樹會發生上溢操做。

  • 將parent、uncle染成Black。(爲了單獨爲一個節點作準備)。
  • 將grand向上合併
  • 將grand染成Red。當作是新節點進行處理。(遞歸,遞歸的代碼只是染色,而旋轉操做只作了1遍)
  • 狀況以下圖所示:

8中DoubleRed狀況

二、刪除

在B樹中真正刪除的元素都在葉子節點(若不是葉子節點,其前驅或者後繼都爲葉子節點,因此在替換後刪除的仍然爲葉子節點。 若是刪除的是20,前驅15仍然是葉子節點)。

刪除操做示例圖

添加狀況處理:

a、當刪除的是Red節點的時候
  • 能夠直接刪除 無需其餘操做
b、刪除Black節點的時候
  • 當擁有2個Red子節點的black節點

    • 不可能直接刪除、由於平衡二叉樹要找到2個度節點的前驅或者後繼、替換後刪除的是前驅或者後繼。(因此不用考慮這個狀況)。
  • 當擁有1個Red子節點的black節點

    • 判斷條件:用代替的子節點是Red
    • 將替代的的子節點染成Black
    • 狀況以下圖所示(刪除60)

刪除狀況1

  • Black葉子節點

    • 若是Black葉子節點的兄弟節點爲Black

      • 兄弟節點有紅色節點
        • 葉子節點被刪除後、可能致使B樹下溢(刪除33節點)
        • 進行旋轉操做(LL/RR/RL/LR),旋轉以後中心節點繼承parent的顏色。 (下圖10繼承20顏色)
        • 旋轉以後左右節點染色爲Black (10的字節點)。
        • 刪除操做下溢
      • 兄弟節點沒有紅色節點
        • 將兄弟節點染Red、parent節點染Black 既可。
          • 若是parent爲Black, 會致使下溢,只須要把parent當作被刪除的節點處理既可(遞歸)實驗可得 遞歸次數小於三次。(下圖中若是40的超級節點上只有40 沒有20和70,那會發生下溢,只須要將40當作被刪除的節點既可)。
          • 刪除狀況2
    • 若是Black葉子節點的兄弟節點爲Red

      • 原理: 此時兄弟節點是20 。 咱們要將30變爲45的兄弟節點。而後在進行兄弟節點爲black操做

      • 將兄弟節點染成Black ,parent染成Red,再進行旋轉。

      • 回到了兄弟節點爲black的狀況。

4、紅黑樹的平衡

紅黑樹是一種弱平衡。黑高度平衡,因爲是黑高度平衡 和紅黑樹性質。因此最大路徑小於最短路徑的2倍

紅黑樹的最大高度是2 * log2^{n + 1},依然是O(logn)級別。

5、時間複雜度

搜索:O(logn)

添加:O(logn),O(1)次旋轉操做

刪除:O(logn),O(1)次旋轉操做

6、AVL樹VS紅黑樹

  • AVL

    • 平衡標準比較嚴格:每一個左右子樹高度差1。

    • 最大高度是1.44 * log2^{(n + 2)} - 1.328(100W個節點,AVL最大高度28)。

    • 搜索、添加、刪除都是O(logn)複雜度,其中添加須要O(1)次旋轉調整、刪除最多須要O(logn)次調整。

  • 紅黑樹

    • 平衡標準比較鬆:沒有一條路徑大於其餘路徑的二倍。

    • 最大高度是2 * log2^{(n + 1)}(100W個節點,紅黑樹最大高度40)。

    • 搜索、添加、刪除都是O(logn)複雜度,其中添加刪除都是O(1)次旋轉調整。

  • 搜索的次數遠大於插入和刪除、選擇AVL樹;

  • 搜索、插入、刪除的操做差很少,選擇紅黑樹;

  • 相對於AVL,紅黑樹犧牲了部分平衡性能換取插入/刪除時的少許旋轉操做。總體性能優於AVL樹

  • 紅黑樹的平均統計性能優於AVL樹,實際應用更多選擇紅黑樹。


喜歡的能夠關注下個人公衆號,會在第一時間更新

相關文章
相關標籤/搜索