紅黑樹

原標題:漫畫算法:什麼是紅黑樹?算法

————————————spa

二叉查找樹(BST)具有什麼特性呢?3d

1.左子樹上全部結點的值均小於或等於它的根結點的值。cdn

2.右子樹上全部結點的值均大於或等於它的根結點的值。排序

3.左、右子樹也分別爲二叉排序樹。it

下圖中這棵樹,就是一顆典型的二叉查找樹:im

1.查看根節點9:d3

2.因爲10 > 9,所以查看右孩子13:db

3.因爲10 < 13,所以查看左孩子11:img

4.因爲10 < 11,所以查看左孩子10,發現10正是要查找的節點:

假設初始的二叉查找樹只有三個節點,根節點值爲9,左孩子值爲8,右孩子值爲12:

接下來咱們依次插入以下五個節點:7,6,5,4,3。依照二叉查找樹的特性,結果會變成什麼樣呢?

1.節點是紅色或黑色。

2.根節點是黑色。

3.每一個葉子節點都是黑色的空節點(NIL節點)。

4 每一個紅色節點的兩個子節點都是黑色。(從每一個葉子到根的全部路徑上不能有兩個連續的紅色節點)

5.從任一節點到其每一個葉子的全部路徑都包含相同數目的黑色節點。

下圖中這棵樹,就是一顆典型的紅黑樹:

什麼狀況下會破壞紅黑樹的規則,什麼狀況下不會破壞規則呢?咱們舉兩個簡單的栗子:

1.向原紅黑樹插入值爲14的新節點:

2.向原紅黑樹插入值爲21的新節點:

因爲父節點22是紅色節點,所以這種狀況打破了紅黑樹的規則4(每一個紅色節點的兩個子節點都是黑色),必須進行調整,使之從新符合紅黑樹的規則。

變色:

爲了從新符合紅黑樹的規則,嘗試把紅色節點變爲黑色,或者把黑色節點變爲紅色。

下圖所表示的是紅黑樹的一部分,須要注意節點25並不是根節點。由於節點21和節點22連續出現了紅色,不符合規則4,因此把節點22從紅色變成黑色:

但這樣並不算完,由於憑空多出的黑色節點打破了規則5,因此發生連鎖反應,須要繼續把節點25從黑色變成紅色:

此時仍然沒有結束,由於節點25和節點27又造成了兩個連續的紅色節點,須要繼續把節點27從紅色變成黑色:

左旋轉:

逆時針旋轉紅黑樹的兩個節點,使得父節點被本身的右孩子取代,而本身成爲本身的左孩子。提及來很怪異,你們看下圖:

圖中,身爲右孩子的Y取代了X的位置,而X變成了本身的左孩子。此爲左旋轉。

右旋轉:

順時針旋轉紅黑樹的兩個節點,使得父節點被本身的左孩子取代,而本身成爲本身的右孩子。你們看下圖:

圖中,身爲左孩子的Y取代了X的位置,而X變成了本身的右孩子。此爲右旋轉。

咱們以剛纔插入節點21的狀況爲例:

首先,咱們須要作的是變色,把節點25及其下方的節點變色:

此時節點17和節點25是連續的兩個紅色節點,那麼把節點17變成黑色節點?恐怕不合適。這樣一來不但打破了規則4,並且根據規則2(根節點是黑色),也不可能把節點13變成紅色節點。

變色已沒法解決問題,咱們把節點13看作X,把節點17看作Y,像剛纔的示意圖那樣進行左旋轉:

因爲根節點必須是黑色節點,因此須要變色,變色結果以下:

這樣就結束了嗎?並無。由於其中兩條路徑(17 -> 8 -> 6 -> NIL)的黑色節點個數是4,其餘路徑的黑色節點個數是3,不符合規則5。

這時候咱們須要把節點13看作X,節點8看作Y,像剛纔的示意圖那樣進行右旋轉:

最後根據規則來進行變色:

如此一來,咱們的紅黑樹變得從新符合規則。這一個例子的調整過程比較複雜,經歷了以下步驟:

變色 -> 左旋轉 -> 變色 -> 右旋轉 -> 變色

幾點說明:

1. 關於紅黑樹自平衡的調整,插入和刪除節點的時候都涉及到不少種Case,因爲篇幅緣由沒法展開來一一列舉,有興趣的朋友能夠參考維基百科,裏面講的很是清晰。

2.漫畫中紅黑樹調整過程的示例是一種比較複雜的情形,沒太看明白的小夥伴也沒必要鑽牛角尖,關鍵要懂得紅黑樹自平衡調整的主體思想。

漫畫算法系列

相關文章
相關標籤/搜索