[C++ 系列] 79. 基於4階B樹詳解R-BTree紅黑樹

0. 前言

在學習紅黑樹前,個人建議先學習下 B 樹,尤其需要了解 4 階 B 樹的添加、刪除,在本博文後續講解中會大量使用,可參考[C++ 系列] 79. 詳解B樹搜索、添加、刪除

1. 紅黑樹的概念

紅黑樹也是一種自平衡二叉搜索樹,以前也叫做平衡二叉 B 樹 ( Stmmertic Binary B-tree )。

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

1.1 疑問:紅黑樹如何保持平衡呢?

紅黑樹沒有 AVL 樹中 平衡因子 的概念,那麼它是如何保持平衡的呢?

  • 在下面學習完紅黑樹插入、刪除再進行解答。

1.2 常見的紅黑樹

一顆標標準準的 紅黑樹 結構如下圖所示:
在這裏插入圖片描述

2. 紅黑樹的構成性質

2.1 紅黑樹的5條重要性質

若一顆樹是 紅黑樹 的話一定要滿足如下 5 條特點:
在這裏插入圖片描述
在這的葉子節點是想象出來的 空節點,即上圖的 null 黑色 節點並不爲上圖的25、74、78、86、90這幾個節點。

2.2 請問下面這棵樹是 紅黑樹 嗎?

在這裏插入圖片描述
眨眼一看好像滿足紅黑樹的各項性質,所以節點僅有紅、黑兩種顏色,且根節點爲黑,任一路徑上沒有兩個相鄰的紅色節點,並且從根節點到達葉子節點的黑色數量都爲 3,它好像就是一顆紅黑樹?
在這裏插入圖片描述

在這的葉子節點是想象出來的 空節點,即上圖的 null 黑色 節點,故能夠發現:55–>38–>null(到達葉子節點) 僅經過了 2 個黑色節點,二其它線路都爲 3 個黑色節點,故其不爲 紅黑樹。

網上技術博文大批量的犯這個錯誤…在此特別之處謹記。
在這裏插入圖片描述

3. 紅黑樹與4階B樹的關係

3.1 紅黑樹與4階B樹的等價變換

將下圖左邊的 紅黑樹 紅色節點上升一層得到右邊的這棵樹?

仔細觀察下,右邊這棵樹不就是顆 B 樹嗎?並且還是個 4 階 B 樹,將其轉換爲更加形象的樣子,見右下圖:
在這裏插入圖片描述

  • 紅黑樹 和 4 階 B 樹(2-3-4樹)具有等價性
  • BLACK 節點與它的 RED 子節點融合在一起,形成1個B樹節點
  • 紅黑樹的 BLACK 節點個數 與 4階B樹的節點總個數相等
  • 網上有些教程:用 2-3樹 與 紅黑樹 進行類比,這是極其不嚴謹的,2-3樹 並不能完美匹配 紅黑樹 的所有情況

注意:後面展示的紅黑樹都會省略 NULL 節點

3.2 紅黑樹 VS 2-3-4樹

在這裏插入圖片描述
如果上圖最底層的 BLACK 節點是不存在的,則整顆 B 樹只有 1 個節點,而且是超級節點。

4. 相關英文單詞

在這裏插入圖片描述
17 就是 33 的兄弟節點,共同的父節點爲 25。
17 與 33 的叔父節點就是 46,50 的叔父節點就是 25。
17、33、50 的祖父節點爲 38。

5. 紅黑樹的添加

5.1 添加前準備

現在看到紅黑樹一定要做到心中有4階 B 樹,會很大方便理解,並且下面的講解也是依據 B 樹的轉化進行。

已知:

  • B樹中,新元素必定是添加到葉子節點中
  • 4 階 B 樹所有節點的元素個數 x 都符合 1 ≤ x ≤ 3
  • 建議新添加的節點默認爲 RED,這樣能夠讓紅黑樹的性質儘快滿足(性質 1、2、3、5 都滿足,性質 4 不一定)
  • 如果添加的是根節點,染成 BLACK 即可

在這裏插入圖片描述

5.2 添加的所有情況

在這裏插入圖片描述
添加新節點只可能加到最後一層的葉子節點上,那麼最後一層的葉子節點有多少種情況呢?

其實上圖已經給出了所有情況:黑、紅黑、黑紅、紅黑紅,由於是 4 階 B 樹,故出現且僅出現這些情況。

那麼在這些葉子節點中進行插入,排除一些不能插入的錯誤情況類似於 25 雖然在 B 樹中爲葉子節點,但在 紅黑樹 概念中其有左右孩子了,故將其排除掉。同理可排除其他不可插入情況,得到如下的 12 種插入情況:
在這裏插入圖片描述
其中有 4 種情況滿足紅黑樹的性質 4,其父節點 BLACK,同樣也滿足 4 階 B 樹的性質,因此不需要做任何額外處理,見下圖所示:
在這裏插入圖片描述
其中有 8 種情況不滿足紅黑樹的性質 4:parent 爲 RED(Double Red),其中前 4 種屬於 B 樹節點上溢的情況,見下圖所示:在這裏插入圖片描述

5.3 修復性質4–LL\RR

其它 6 種情況暫且不論,先看看下圖這兩種情況:
在這裏插入圖片描述
即 50–>52、72–>60 違背了性質四。首先站在 B 樹的角度來思考,52、60 加入必然要成爲一個 B 樹節點,那麼 回想一下 B 樹節點是怎麼形成的呢?B 樹節點是由一個黑色節點與他的紅色子節點形成的, 那麼在此若 52 想成爲 B 樹節點,那麼 50 就需要變成黑色,並且 46 變成 紅色,才能合併到一起變爲 B 樹節點。

此時會發現,紅38–>紅46 豈不是兩個紅色相連了?在這的直觀思想是讓 紅38–>黑50,不就能解決了嗎?再仔細觀察,這是不是 AVL 樹中的 RR 情況,針對 46 進行左旋轉,讓 50 成爲子樹的根節點,46 成爲子樹的子節點,就萬事大吉了!

同理,將 72 染成黑色成爲 B 樹節點,76 需要染成紅色,並且現在是 LL 情況,僅需對 76 進行右旋轉,讓 72 成爲子樹的根節點,76 成爲 72 的子節點。

轉換效果圖如下圖所示:
在這裏插入圖片描述
判定條件:uncle 不是 RED

  1. parent 染成 BLACK,grand 染成 RED
  2. grand 進行單旋操作

LL:grand 右旋轉
RR:grand 左旋轉

5.4 修復性質4–LR\RL

上述兩種情況搞定後,再看看下圖這兩種情況:
在這裏插入圖片描述
有了上面的基礎可以知道,46–>50–>48是 RL 情況,76–>72–>74 是 LR 情況。

那麼針對46–>50–>48是 RL 情況,就先讓 50 做右旋轉,再讓 46 做左旋轉,現在 48 上去成爲這顆子樹的根節點,那麼就需要對 48 將其染爲 黑色,左右變成紅色。

轉換效果圖如下圖所示:
在這裏插入圖片描述
判定條件:uncle 不是 RED

  1. 自己染成 BLACK,grand 染成 RED
  2. 進行雙旋操作

LR:parent 左旋轉, grand 右旋轉
RL:parent 右旋轉, grand 左旋轉

5.5 如何區分其它的四種情況

判斷 uncle 顏色是否爲 RED,如果不爲 RED 就是上面四種情況,如果爲 RED 則爲下述 4 種情況。

下面舉幾個 uncle 的例子,紅黑樹 如下圖所示:
在這裏插入圖片描述

  • 10 的 uncle 節點 是 33,爲紅色
  • 48、52 的 uncle 節點是 46 的左孩子爲 null,可將 null 視爲黑色,故其 uncle 爲黑色
  • 60、74 的 uncle 節點是 76 的右孩子爲 null,可將 null 視爲黑色,故其 uncle 爲黑色

5.6 修復性質4 – 上溢 – LL

經過上面情況的區分,來看一種新的情況,上溢 – LL,如下圖所示:
在這裏插入圖片描述
首先從 B 樹角度出發,25、17、33、10 明顯產生了上溢情況,因爲 4 階 B 樹最多隻能存 3 個數據,現在產生了上溢。

解決方法就是跳出最中間的向上合併,然後進行分裂即可。在這 17、25 都算是中間的元素,在這就挑 25 作爲中間節點向上合併,因爲其顏色剛好搭配,在這不要思考 25 向上合併後的各種情況,比如 38 作爲 B 樹根節點一定需要變爲黑色,而相鄰節點變爲紅色等系列的問題,先來考慮 17–>10、33 小方面的針對 B 樹情況進行考慮。

17、33 由於 25 的向上合併,都要變爲 B 樹節點,在這就需要將其變爲黑色。

那麼一個小總結就出來了,若是 上溢 – LL 情況,即需要將其父節點、叔父節點均變成黑色即可。

最後來考慮祖父節點 25 的向上合併,本來 38、55 這個位置只有兩個節點,現在 25 向上合併,就相當於對 38、55 進行新添加節點 25 的操作,那麼就是依然是插入的 12 種情況,將其變成紅色配對情況即可,這是一個遞歸的操作!效果如下圖所示:
在這裏插入圖片描述
但若祖父節點 25 持續上溢到根節點的話,並且此時根節點也觸發了上溢的條件的話,即下圖的情況。此時又需要找中間的元素,在下圖中就是 38、55 這兩個情況,只需要將根節點轉成黑色即可。
在這裏插入圖片描述
這個上溢的 LL 情況,只需要進行染色即可,根本沒進行旋轉的操作。

判定條件:uncle 是 RED

  1. parent、uncle 染成 BLACK
  2. grand 向上合併,並染成 RED,當做是新添加的節點進行處理
  3. grand 向上合併時,可能繼續發生上溢,若上溢持續到根節點,只需將根節點染成 BLACK 即可。

5.7 修復性質4 – 上溢 – RR

順理成章的又出來了一種新的情況,上溢 – RR,如下圖所示:
在這裏插入圖片描述
有了上面 5.6 的經驗,現在的操作就簡單很多了。將 36 的祖父節點 25 拿出來染成紅色,當做一個新的節點,實行插入操作的向上合併。將 17、33 的父節點、叔父節點染成黑色,此時 17、33 就獨立成了一個 B 樹節點,其它的都與之前的邏輯一致了。直接看效果圖如下:
在這裏插入圖片描述
判定條件:uncle 是 RED

  1. parent、uncle 染成 BLACK
  2. grand 向上合併,並染成 RED,當做是新添加的節點進行處理,可能繼續發生上溢,若上溢持續到根節點,只需將根節點染成 BLACK 即可。

5.8 修復性質4 – 上溢 – LR

倒數第二種情況了,上溢 – LR,如下圖所示
在這裏插入圖片描述
此時 20、17、25、33 依然發生上溢,同理祖父節點 25 需要進行向上合併,叔父節點染成黑色即可。效果圖如下:
在這裏插入圖片描述
判定條件:uncle 是 RED

  1. parent、uncle 染成 BLACK
  2. grand 向上合併,並染成 RED,當做是新添加的節點進行處理,可能繼續發生上溢,若上溢持續到根節點,只需將根節點染成 BLACK 即可。

5.9 修復性質4 – 上溢 – RL

最後一種情況,上溢 – RL,如下圖所示:
在這裏插入圖片描述
現在的話道理都是一樣的了,直接效果圖如下:
在這裏插入圖片描述
判定條件:uncle 是 RED

  1. parent、uncle 染成 BLACK
  2. grand 向上合併,並染成 RED,當做是新添加的節點進行處理,可能繼續發生上溢,若上溢持續到根節點,只需將根節點染成 BLACK 即可。

6. 紅黑樹添加元素總結

站在 4 階 B 樹的角度上看,紅黑樹添加共有 12 種情況,其中 4 種情況符合紅黑樹定義,不需要進行修復調整,而其餘八中情況可分爲如下三大情況:

  • 若插入節點位置 uncle 不爲 RED 的 LL\RR 情況的話,僅需要 parent 染成 BLACK,grand 染成 RED 並將grand 進行對應的單旋操作即可
    LL:grand 右旋轉
    RR:grand 左旋轉
  • 自己染成 BLACK,grand 染成 RED 進行雙旋操作即可
    LR:parent 左旋轉, grand 右旋轉
    RL:parent 右旋轉, grand 左旋轉
  • 若插入節點位置 uncle 爲 RED 情況的話,就爲上溢的情況,不需要進行旋轉,僅染色和向上合併即可。具體爲 parent、uncle 染成 BLACK,grand 向上合併,並染成 RED,當做是新添加的節點進行處理,可能繼續發生上溢,若上溢持續到根節點,只需將根節點染成 BLACK 即可。

7. 紅黑樹的刪除

同樣對比 4 階 B 樹我們知道,在 B 樹中真正從內存中被刪除的節點元素都在葉子節點中。那麼就有下面幾種情況。

7.1 刪除 – RED節點

紅黑樹結構圖如下:
在這裏插入圖片描述
假如刪除紅色 17、33、50、72 刪除一個或多個的話,對紅黑樹沒有影響,它依然是一顆 紅黑樹,並且是一顆 4 階 B 樹。

7.2 刪除 – BLACK節點

紅黑樹結構圖如下:
在這裏插入圖片描述
有 3 種情況:

  1. 擁有 2 個 RED 子節點的 BLACK 節點,在此即 25 節點。25 節點的度爲 2, 而在二叉搜索樹當中,一定是不可能刪除一個度爲 2 的節點的,同時一定會找到它的 前驅 / 後繼 進行刪除。不可能被直接刪除,因爲會找它的子節點替代刪除。因此不用考慮這種情況

  2. 擁有 1 個 RED 子節點的 BLACK 節點,在此即 46、76 節點

  3. BLACK 葉子節點,在此即 88 節點

因爲情況 1 不必考慮,那麼刪除情況就僅有擁有1個RED子節點的BLACK節點、BLACK 葉子節點這兩種情況了。

7.3 刪除 – 擁有1個RED子節點的BLACK節點

紅黑樹結構如下圖:
在這裏插入圖片描述
加入現在要刪除 46 、76 的情況,那怎麼判定是這種情況呢?仔細觀察可發現,它是度爲 1 的節點,在二叉搜索樹中,就需要找到他的子節點進行刪除即可,即將 46 刪除 並將 55–>50,將 76 刪除 並將 80–>72,即效果圖如下:
在這裏插入圖片描述
即爲:
在這裏插入圖片描述
這樣刪除明顯不符合紅黑樹的性質啊,如果從 B 樹角度出發,將 46、76 進行直接刪除,那麼 50、72 獨立成爲 B 樹節點,那麼 B 樹節點一定是黑色的。

判定條件:用以替代的子節點是 RED

  • 將替代的子節點染成 BLACK 即可保持紅黑樹性質

7.4 刪除 – BLACK葉子節點 – sibling(兄弟節點)爲BLACK,且有 RED 子節點

紅黑樹結構圖如下:
在這裏插入圖片描述
在這中情況下就是刪除 46、88 節點,在 BST 樹角度上,就是直接被刪除,但在 4 階 B 樹中就發生了下溢,因爲 4 階 B 樹保證節點的數據最少要有 1 個,最多爲 3 個。在這進行了 88 的刪除的話,自然發生下溢情況。

在 B 樹中處理下溢情況的方法就是,看看兄弟節點是否能借出一個節點在這裏先考慮能借出節點的三種情況如下圖:
在這裏插入圖片描述
通過觀察能夠發現這三種情況下,它的兄弟節點都有一個紅色孩子節點,這樣兄弟節點就至少有兩個節點了,才能借出一個節點。並且兄弟節點的顏色一定是黑色,如果它的兄弟節點爲紅色的話,那麼這個兄弟節點一定是在 父節點 裏面的。我們能夠知道如果父節點爲紅色,那麼兄弟節點就不能再爲紅色,即爲黑色,如果父節點爲黑色,根據紅黑樹與 4 階 B 樹等價原則,父節點與他的所有子節點構成一個 B 樹節點,那麼在 B 樹中這個紅色兄弟節點是在父節點上的。

就如下如圖所示,55 作爲父節點怎麼可能把節點借出來呢?我們需要借的是左右臨近的紅色節點。
在這裏插入圖片描述
現在見上圖,如果刪掉 88,76 兄弟給借紅色子節點 78 來處理下溢問題,那麼就是 80 作爲父節點下去到 88 的位置,在兄弟裏面挑一個,儘量挑個居中的作爲父節點,即 78 上去作爲新的父節點
在這裏插入圖片描述並且還能夠發現上圖這個情況其實是從 80–>76–>78 d的 LR 情況,首先對 76 進行左旋轉,那麼 78 就上去了,再對 78 做右旋轉 那麼 78 就上去了,80 就下去了,下溢情況調整完畢。

通過旋轉之後新的父節點要繼承原有父節點的顏色,並且它的左右節點需要變成獨立的 B 樹節點,那麼就需要將其左右節點全部染成黑色。因爲 80 旋轉下去就它一個,肯定爲獨立的 B 樹節點,76 作爲它的兄弟節點也一定爲 黑色 並且也是獨立的 B 樹節點。

到現在,刪除 – BLACK葉子節點 – sibling(兄弟節點)爲BLACK 的情況這樣纔算調整完畢,接下來再看幾個例子加深理解:
在這裏插入圖片描述
刪除 88 節點,現在就是很明顯的從 80–>76–>72 的 LL 情況,直接對 80 節點進行右旋轉即可。並且旋轉過後,76 繼承 80 的顏色,並將 76 的左右節點染成黑色。效果圖如下:
在這裏插入圖片描述
再來個例子:
Aa
刪除 88 節點,現在就是很明顯的從 80–>76–>72 的 LL 情況,從 80–>76–>78 的 LR 情況,在這就選擇 LL 對 直接對 80 節點進行右旋轉即可,因爲這樣只需要旋轉一次,而 LR 卻要進行兩次旋轉。並且旋轉過後,76 繼承 80 的顏色,並將 76 的左右節點染成黑色。效果圖如下:
在這裏插入圖片描述
如果按照 LR 來進行兩步旋轉的話,結構和上面的又不太一致,因爲一開始對 76 進行左旋轉,78 上去,再對 78 進行右旋轉,78 作爲新的父節點,80 下去解決下溢問題,再將 78 染成原來的父節點顏色,左右染成黑色即可,效果圖如下:
在這裏插入圖片描述
所以紅黑樹的刪除,刪完之後可能出現多種樹的結構,可能都是滿足情況的正確答案。

判定條件:BLACK 葉子節點被刪除後,會導致B樹節點下溢(比如刪除88),此時如果 sibling 至少有 1 個 RED 子節點

  • 進行旋轉操作
  • 旋轉之後的中心節點繼承 parent 的顏色
  • 旋轉之後的左右節點染爲 BLACK

7.5 刪除 – BLACK葉子節點 – sibling(兄弟節點)爲BLACK,沒有 RED 子節點

紅黑樹效果圖如下:
在這裏插入圖片描述
依舊刪除 88,此時它的兄弟節點沒有紅色子節點,發生了下溢的情況,那麼就需要用到 B 樹的 合併 方式來處理下溢的情況了。合併是從父節點 80 下來和 76 合併到一起,那麼父節點下來與它的子節點融合到一起成爲 B 樹節點,此時就需要對父節點染成黑色,將兄弟節點染成紅色即可。效果圖如下:
在這裏插入圖片描述
如果父節點是黑色的情況呢?如果父節點下來,B 樹節點必然產生下溢情況。那麼要是父節點旁邊出現紅色節點呢?是不是就不會產生下溢情況了?

答案是不可能再出現紅色節點的,因爲刪除節點爲黑色葉子節點,並且它的兄弟節點仍是黑色節點,此時父節點的 left、right 都已經有所指了,自然不會存在再指向一個紅色節點的情況。如下圖:
在這裏插入圖片描述
其實這個情況處理很簡單,只需要將父節點當做被刪除的節點即可,也是一個遞歸的調用。很類似於處理上溢問題的遞歸調用。
在這裏插入圖片描述
判定條件:sibling 沒有 1 個 RED 子節點

  • 將 sibling 染成 RED、parent 染成 BLACK 即可修復紅黑樹性質
  • 如果 parent 是 BLACK,會導致 parent 也下溢,這時只需要把 parent 當做被刪除的節點處理即可

7.6 刪除 – BLACK葉子節點 – sibling(兄弟節點)爲RED

在此黑色的葉子節點的兩種情況已經講完了,下面來看最後一種情況,紅黑樹結構圖如下:
在這裏插入圖片描述
依舊刪除 88,在 B 樹中就產生了下溢的情況,還得看 76 能不能借節點,如果能借就借一個節點,如果不能借就讓父節點下來合併解決下溢問題。但是在這就比較麻煩,現在 88 的兄弟是 55 ,55 的兒子纔是 76,就多跨了一層關係,現在爲了解決這個問題,我們強制讓 76 做 88 的兄弟,那麼就又回到了黑兄弟的情況了。
在這裏插入圖片描述
那麼思想就很簡單了,就是單純的讓 80 指向 76 就好了。見上圖可知道可以通過 LL 情況實現,讓 80 進行右旋轉,此時 55 上去成爲新的父節點,80 指向 55 的右孩子 76 節點,而 55 的右邊指向 80 。再將刪除節點的兄弟節點即 55 節點染成黑色,父節點染成紅色即可,效果圖如下:
在這裏插入圖片描述
於是又回到了兄弟節點爲黑色的情況,即 7.5 的情況。如果將 88 刪掉,產生下溢,父節點向下合併,成爲 B 樹節點,即將 80 染黑,76 染紅即可,效果圖如下:
在這裏插入圖片描述
再來舉一個例子:
在這裏插入圖片描述
依舊刪除 88 節點,需要讓 80 的左邊指向 76,並將父節點染成紅色,兄弟節點染成黑色:
在這裏插入圖片描述
回到兄弟節點爲黑色的情況了,按照 80–>76–>78 進行 LR 兩步旋轉的話,一開始對 76 進行左旋轉,78 上去,再對 78 進行右旋轉,78 作爲新的父節點,80 下去解決下溢問題,再將 78 染成原來的父節點顏色,左右染成黑色即可,效果圖如下:
在這裏插入圖片描述
判定條件:sibling 是 RED

  • sibling 染成 BLACK,parent 染成 RED,進行旋轉
  • 於是又回到 sibling 是 BLACK 的情況

8. 紅黑樹刪除元素總結

與 BST 樹一致真正刪除的節點肯定是刪除的葉子節點,那麼以待刪除節點的顏色來考慮,若爲紅色,則直接刪除即可,不需要作任何調整,若爲黑色,則分以下三種情況:

  1. 擁有 2 個 RED 子節點的 BLACK 節點,不可能被直接刪除,因爲會找它的子節點替代刪除。因此不用考慮這種情況

  2. 擁有 1 個 RED 子節點的 BLACK 節點

  3. BLACK 葉子節點

於是就只有情況2、3 需要我們來討論,即有:

  1. 刪除 – 擁有 1 個 RED 子節點的 BLACK 節點
  • 判定條件:用以替代的子節點是 RED
  • 解決方式:將替代的子節點染成 BLACK 即可保持紅黑樹性質
  1. 刪除 – BLACK 葉子節點 – sibling爲 BLACK
  • 判定條件:BLACK 葉子節點被刪除後,會導致B樹節點下溢(比如刪除88),並且如果 sibling 至少有 1 個 RED 子節點
  • 解決方式:進行旋轉操作,旋轉之後的中心節點繼承 parent 的顏色,旋轉之後的左右節點染爲 BLACK
  1. 刪除 – BLACK 葉子節點 – sibling爲 BLACK
  • 判定條件:sibling 沒有 1 個 RED 子節點
  • 解決方式: 將 sibling 染成 RED、parent 染成 BLACK 即可修復紅黑樹性質,處理後如果 parent 是 BLACK會導致 parent 也下溢,這時只需要把 parent 當做被刪除的節點調用遞歸的刪除即可
  1. 刪除 – BLACK葉子節點 – sibling爲RED
  • 判定條件:sibling 是 RED
  • 解決方式: 將 sibling 染成 BLACK,parent 染成 RED 進行旋轉,於是又回到 sibling 是 BLACK 的情況

9. 答疑:紅黑樹的平衡

最初遺留的困惑:爲何那5條性質,就能保證紅黑樹是平衡的?
回答:那5條性質,可以保證 紅黑樹 等價於 4階B樹,在這就不證明了,有興趣coder可自行證明,或者查閱相關資料
在這裏插入圖片描述

  • 相比AVL樹,紅黑樹的平衡標準比較寬鬆:沒有一條路徑會大於其他路徑的2倍,因爲要保證每條路徑下黑色節點個數一致,那麼最短路徑就是全黑節點,最長路徑就是一個黑緊接着一個紅,這樣最長路徑的節點個數也就只能不超過最短路徑的節點個數了
  • 是一種弱平衡、黑高度平衡
  • 紅黑樹的最大高度是 2log(N+1)2 ∗log(N+1),依然是 O(logN)O(logN) 級別

10. 平均時間複雜度

◼ 搜索:O(logN)O(logN)

◼ 添加:O(logN)O(logN)O(1)O(1) 次的旋轉操作

◼ 刪除:O(logN)O(log N)O(1)O(1) 次的旋轉操作

11. AVL樹 vs 紅黑樹

AVL樹:

  • 平衡標準比較嚴格:每個左右子樹的高度差不超過1
  • 最大高度是 1.44log2N+21.3281.44 ∗ log_2 N + 2 − 1.328(100W個節點,AVL 樹最大樹高28)
  • 搜索、添加、刪除都是 O(log2N)O(log_2N) 複雜度,其中添加僅需 O(1)O(1) 次旋轉調整、刪除最多需要 O(log2N)O(log_2N) 次旋轉調整

紅黑樹:

  • 平衡標準比較寬鬆:沒有一條路徑會大於其他路徑的2倍

  • 最大高度是 2log2(n+1)2 ∗ log_2(n + 1)( 100W個節點,紅黑樹最大樹高40)

  • 搜索、添加、刪除都是 O(log2N)O(log_2 N )複雜度,其中添加、刪除都僅需 O(1)O(1)次旋轉調整

  • 搜索的次數遠遠大於插入和刪除,選擇 AVL 樹;搜索、插入、刪除次數幾乎差不多,選擇紅黑樹

  • 相對於 AVL樹來說,紅黑樹犧牲了部分平衡性以換取插入/刪除操作時少量的旋轉操作,整體來說性能要優於 AVL 樹

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

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