演算法導論 13章 紅黑樹

2021-07-02 07:46:13 字數 2719 閱讀 4948

1,每個節點非黑即紅。

2,根節點是黑色的。

3,葉節點(nil)是黑色的。

4,紅節點的兩個孩子都是黑色的。

5,對每個節點,從該節點到其所有後代的簡單路徑上,均包含了同樣數目的黑節點。

為了維持紅黑樹的性質,要改變某些節點的顏色和指標結構,旋轉改變了指標結構。

左旋:以x和y之間的鏈為「支軸」進行的,使得x的右孩子為y的左孩子,y的父節點為x的父節點,y的左孩子為x。

**:

template

t>

void redblacktree

::left_rotate(redblacktreenode

*pnode)

每次插入節點,至多只有乙個性質性質被破壞,性質2或者4

如果是性質2,則將根節點變為黑色即可。

違反性質4,必定因為它和它的父親都為紅色,則其祖父節點必為黑色。此時根據父親是祖父的左孩子還是右孩子進行討論,左右之間是對稱的,書中只給出了左孩子的三種情況。

情況1: z的叔叔結點y是紅色的

將祖父染為紅色,父親和叔叔染為黑色,將祖父變成判定點,一直向上迴圈判斷。
情況2:z的叔叔y是黑色的,而且z是右孩子

情況3:z的叔叔y是黑色的,而且z是左孩子

情況2可以通過旋轉變為情況3.之後,將父親染成黑色,祖父染成紅色,再從祖父處進行右旋轉。過程中不會對其他紅黑樹性質造成破壞。
刪除過程與二叉查詢樹一樣,分為三種情況

<1>無左右孩子、<2>有左孩子或者右孩子、<3>既有樹=左孩子又有右孩子。
但刪除後還得檢查是否破壞紅黑樹性質。

如果刪除的是黑節點,會破壞紅黑樹性質。
違反性質的三種情況:

1:若刪除的是根節點,唯一子節點為紅色,則根節點變成紅色,違反了性質2.

2:若被刪節點的唯一孩子和父親都是紅色,性質4被破壞.

3:被刪節點會導致包含該點的路徑的黑節點樹-1,違反了性質5.

額外一重黑色:

頂替被刪節點的節點還有一重額外的黑色,此時可能違背了性質1(紅+黑),但在這種假設下,性質5成立。節點額外的黑色是針對x節點的,不是反映在color屬性上的。
函式修復性質1,2,4:

性質2、4很簡單,因為x為紅色,所以將x變為黑色即可。

性質1:函式的目的是將額外的黑色沿樹上移,直到:

x指向紅黑節點,將x著為黑色。

x指向根節點。

執行適當的旋轉和重新著色,退出迴圈。

注意x總是指向具有雙重黑色的非根節點。

w不可能是t.nil

性質5交換前後不變

四種情況:

情況1:x的兄弟w是紅色的

此時因為x是雙重黑色,貢獻兩個黑色結點,所有w必有黑色孩子。此時將w著為黑色,父親著為紅色,在對父親做一次左旋轉。此時x的新兄弟w是黑色,這樣將情況1轉換為情況2、3或4。

情況2:x的兄弟w是黑色的,而且w的兩個孩子都是黑色的。

處理過程是從x和w上去掉一重黑色,即x只有一重黑色而w著為紅色,給x的父節點新增額外黑色。

情況3:x的兄弟w是黑色的,w的左孩子是紅色的,右孩子是黑色的

交換w和其左孩子的顏色,並對w進行右旋轉。旋轉後x的新兄弟w是乙個有紅色右孩子的黑結點,轉換成了情況4。

情況4:x的兄弟w是黑色的,而且w的右孩子是紅色的。

執行過程是將w的顏色設定為父親的顏色,將父親的顏色設定為黑色,將w的右孩子著為黑色,然後在父親做一次右旋,最後將x設定為根root。

1.1

8                               

4 12

2 6 10 14

1 3 5 7 9 11 13 15

8

4(紅) 12(紅)

2 6 10 14

1 3 5 7 9 11 13 15

8

4(紅) 12(紅)

2 6 10 14

1 3 5 7 9 11 13 15 (全紅)

1.2

不是,違反了性質4,。不是,違反了性質5。
1.3

1.4

此時的葉節點深度為黑高度
1.5

紅節點的數目<=黑節點數,全為黑節點的路徑為紅黑相等路徑的一半
1.6

2^2k-1  2^k-1
1.7

2:1

0

演算法導論 第13章 紅黑樹

特點 1 每個節點的顏色或是紅,或是黑 2 根節點是黑色 3 葉節點是黑色 4 如果乙個節點是紅色,則葉子為黑 5 對每個節點,從該節點 紅黑樹插入流程 第一步 和bst的插入過程相似,將待插入節點z插入到乙個紅黑樹的葉子節點,並著紅色 因為第一步之後可能會違反紅黑樹的某些性質,所以要進行下一步 第...

學習 《演算法導論》第13章 紅黑樹 總結三

今天把這編部落格寫完吧,這裡學習紅黑樹的刪除操作,前面學習了 紅黑樹的定義及旋轉 紅黑樹的插入操作 紅黑樹的刪除操作也要結合二叉查詢樹的刪除操作來學習。在一棵n個結點的紅黑樹中刪除乙個結點也是一樣的,要花o lgn 的時間,刪除操作比插入還要複雜!刪除也分為兩步 第一步,當成二叉查詢樹處理,刪除乙個...

紅黑樹(演算法導論)

測試 所用的例子為算導第三版p179圖13 4 include using namespace std const bool black 0 黑色 const bool red 1 紅色 struct node 結點結構 class rb tree 初始化nil結點和root node left r...