紅黑樹下 紅黑樹的實現

2021-09-13 08:28:15 字數 3148 閱讀 1315

1. 實現紅黑樹的基本思想

實際上,紅黑樹是有固定的平衡過程的:遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。

首先,我們需要再來看一下紅黑樹的定義:

在插入、刪除節點的過程中,第

三、四點要求可能會被破壞,所以「平衡調整」,實際上就是把被破壞的第

三、四點恢復過來。

在調整過程中有兩個非常重要的操作,左旋(rotate left)和右旋(rotate right),左旋其實就是圍繞某個節點的左旋,而右旋就是圍繞某個節點的右旋

2. 插入操作的平衡調整

紅黑樹規定,插入的節點必須是紅色的。而且,二叉查詢樹中新插入的節點都是放在葉子節點上。所以,插入操作的平衡調整,有這樣兩種特殊情況:

除此之外,其它情況都會違背紅黑樹的定義,於是我們就需要進行調整,調整的過程包含兩種基本的操作:左右旋轉和改變顏色

紅黑樹的平衡調整是乙個迭代的過程,我們把正在處理的節點叫作關注節點,關注結點會隨著迭代的進行而不斷變化,最初的關注節點就是新插入的節點。

新節點插入後,如果紅黑樹的平衡被打破,那一般會有下面三種情況。我們只需要根據每種情況的特點,不停地調整,就可以讓紅黑樹繼續保持平衡。

為了簡化描述,我們把父節點的兄弟節點叫作叔叔結點,父節點的父節點叫作祖父節點。

case 1 :如果關注節點是 a,它的叔叔結點 d 是紅色,我們就依次執行下面的操作

case 2 :如果關注節點是 a,它的叔叔結點 d 是黑色,關注節點 a 是其父結點 b 的右子節點,我們就依次執行下面的操作

case 3 :如果關注節點是 a,它的叔叔結點 d 是黑色,關注節點 a 是其父結點 b 的左子節點,我們就依次執行下面的操作

3. 刪除操作的平衡調整

刪除操作的平衡調整分為兩步,第一步是針對刪除節點初步調整。初步調整是保證整棵紅黑樹在乙個節點刪除之後,仍然滿足第四條的定義。第二步是針對關注節點進行二次調整,讓它滿足紅黑樹的的第三條定義。

3.1. 針對刪除節點初步調整

經過初步調整後,為了保證紅黑樹的第四條要求,有些節點會被標記為兩種顏色,「紅-黑」 或者 「黑-黑」,如果乙個節點被標記為了 「黑-黑」,那在計算黑色節點個數的時候,要算成兩個黑色節點。

下面,如果乙個節點既可以是紅色,也可以是黑色,我們用一半黑色一半紅色來表示。如果乙個節點是 「紅-黑」 或者 「黑-黑」,我們用左上角的乙個小黑點來表示。

case 1 :如果要刪除的節點是 a,它只有乙個子節點 b,我們就依次執行下面的操作

case 2 :如果要刪除的節點 a 有兩個非空子節點,並且它的後繼節點就是它的右子節點 c,我們就依次執行下面的操作

case 3 :如果要刪除的節點 a 有兩個非空子節點,並且它的後繼節點不是右子節點,我們就依次執行下面的操作

3.2. 針對關注節點進行二次調整

經過初步調整之後,關注節點變成了 「紅-黑」 或者 「黑-黑」 節點,針對這個關注節點,我們再分四種情況來進行二次調整,二次調整是為了讓紅黑樹中不存在相鄰的紅色節點。

case 1 :如果關注節點是 a,它的兄弟節點 c 是紅色的,我們就依次執行下面的操作

case 2 :如果關注節點是 a,它的兄弟節點 c 是黑色的,並且節點 c 的左右子節點 d、e 都是黑色的,我們就依次執行下面的操作

case 3 :如果關注節點是 a,它的兄弟節點 c 是黑色的, c 的左子節點 d 是紅色,c 的右子節點 e 是黑色,我們就依次執行下面的操作

case 4 :如果關注節點是 a,它的兄弟節點 c 是黑色的,並且 c 的右子節點是紅色的,我們就依次執行下面的操作

4. 紅黑樹為什麼要求葉子節點是黑色的空節點?

之所以有這麼奇怪的要求,其實就是為了實現方便。只要滿足這一條要求,那在任何時刻的平衡操作就都可以歸結為上述的幾種情況。

下面我們來看乙個葉子節點如果不為黑色的情況。

當插入乙個紅色節點時,紅黑樹的定義就被破壞了,而這個時候這種情況也不滿足上述的三種情況。但如果我們加上黑色的空節點後,它就滿足 case 2 了。另外,我們也可以對每種情況的條件進行修改,但那樣的話規則就沒有原來那麼簡潔了。

另外,我們並不是給每個黑色的空的葉子節點都分配一塊記憶體,而是共用乙個就行,這樣也不會導致儲存空間的極大浪費。

5. 小結

參考資料-極客時間專欄《資料結構與演算法之美》

紅黑樹下 紅黑樹的實現

1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...

紅黑樹實現

紅黑樹 是一棵二叉搜尋樹,它在每個節點上增加了乙個儲存位來表示節點的顏色,可以是red或black。通過對任何一條從根到葉子簡單路徑上的 顏色來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似於平衡 由於性質中紅色節點不連續,最短路徑可為全是連續黑結點,最長路徑則由於紅節點不連續,則每間隔乙個...

紅黑樹實現

按演算法導論裡的偽 用c 實現了紅黑樹。實現過程中,參考了nginx的紅黑樹實現,特別是右旋的實現,演算法導論裡沒有給出,就借鑑了nginx的實現。對比了nginx的紅黑樹實現和演算法導論裡的偽 插入基本上一樣的,刪除兩者有點差別,但思路應該是一樣的。實現過程中需要注意的是,空葉子結點一定要實現,不...