紅黑樹學習小記

2021-10-13 23:36:12 字數 2709 閱讀 2840

紅黑樹是一棵帶拓展節點的平衡二叉樹,即某個節點若沒有左兒子,則新建乙個拓展節點作為左兒子。右兒子同理。拓展節點稱為外部節點,其餘節點稱為內部節點。

每個節點被染成紅色或黑色。其中

需要滿足的性質:

稱從節點 x

xx 出發,到其子樹內任意乙個外部節點路徑上的黑點數量為 x

xx 的秩(不包括 x

xx,但包括外部節點)。顯然外部節點的秩為 0

00。稱紅黑樹的秩為根節點的秩。

在修改操作中,需要維護紅黑樹的以下性質:

查詢操作則與普通的二叉查詢樹相同。

先將新節點插入到某乙個原來外部節點的位置,並將其染成紅色。此時原來內部節點的秩均沒有發生改變。

接下來檢查紅黑樹的性質是否滿足。

case 1

當前節點的父節點是黑色,則直接退出。

case 2

當前節點的父節點是紅色。此時分為幾種情況處理:

case 2.1

若叔父(父親的兄弟)節點是黑色,則通過旋轉進行調整。

若當前節點為 xxx:

對於不同的情況,把 x

xx 以及 x

xx 的父親和祖父的中位數旋轉到根節點。

若叔父節點是紅色,則通過改變顏色進行調整。

這樣便不會改變除了祖父以外的節點的秩。但可能會導致產生新的相鄰紅色節點,因此仍要繼續檢查並重複上述過程。

若待刪除節點的兩個兒子都是內部節點,則將其資訊與右子樹中鍵值最大的節點交換。此時需要刪除的節點至多只有乙個內部節點作為兒子。刪除 x

xx 的時候,若有內部兒子,則用內部兒子替換 x

xx,否則直接將 x

xx 替換成外部節點。現在分幾種情況討論,來維護紅黑樹的性質。

case 1

若 x

xx 是紅色節點,則直接刪除 xxx。

case 2

若 x

xx 是黑色節點,且有乙個兒子是紅色節點,則將 x

xx 替換成紅色兒子,並將其染成黑色。

case 3

若 x

xx 是黑色節點,且沒有紅色兒子,此時又分為三種情況。

case 3.1

若 xx

x 的兄弟節點 c

cc 為紅色。b

bb 為 x

xx 的父節點,則將 b

bb 旋轉使得 c

cc 變為根,然後將 b

bb 染成紅色,將 c

cc 染成黑色,轉化為 case 2 或 case 3 的情況。

若 xx

x 的兄弟節點 c

cc 為黑色,且沒有紅色兒子。則將 c

cc 染成紅色,將 b

bb 染成黑色。若 b

bb 原來也是黑色,則可能會導致 b

bb 的父節點的秩增加 1

11,需要繼續處理。

若 xx

x 的兄弟節點 c

cc 為黑色,且有紅色兒子 d

dd,此時又分為兩種情況:

若 xx

x 是 b

bb 的左(右)兒子,d

dd 是 c

cc 的右(左)兒子,即兩者異側。則通過單旋將 c

cc 變為根,同時繼承 b

bb 原來的顏色。然後將 b

bb 和 d

dd 染成黑色。

若 xx

x 是 b

bb 的左(右)兒子,d

dd 是 c

cc 的右(左)兒子,即兩者同側。通過雙旋將 d

dd 變為根,同時繼承 b

bb 原來的顏色。然後將 b

bb 染成黑色。

文中的來自北大黃群老師開的數算實驗班中的課件。

紅黑樹 學習

紅黑樹筆記 紅黑樹是一顆二叉平衡樹,查詢不會破壞平衡性,所以和二叉平衡術查詢方式一致。從根節點開始查詢,為空就返回null,為當前值就返回,否則繼續向下查詢。如果當前節點的key為要查詢的節點的key,那麼直接返回當前值。如果當前節點的key大於要查詢的節點的key,那麼繼續向當前節點的左子節點查詢...

紅黑樹學習筆記

二叉樹,他的定義是每個節點最多只有兩個子樹 即左子樹和右子樹,當然也可以沒有子樹 如下圖是乙個簡單的二叉樹 對於這樣的資料結構,在c語言中通常這樣來定義結構體?1 2 3 4 5 typedefstruct binary tree binarytree 二叉搜尋樹,首先他也是乙個二叉樹,與二叉樹不同...

紅黑樹學習筆記

因為學習hashmap的時候,遇到了紅黑樹,故而複習哈,想深度學習的請轉到下面鏈結,作者 並茂的詳細講解了哈,分析的很清楚,覺得好的不忘給別人手動比心。30張圖帶你徹底理解紅黑樹 因為從這裡開始,是自己的學習筆記,從上面提到的文章中學習總結的,主要是為了給自己看,記錄哈,容易忘記,純概念,可能比較苦...