紅黑樹是一棵帶拓展節點的平衡二叉樹,即某個節點若沒有左兒子,則新建乙個拓展節點作為左兒子。右兒子同理。拓展節點稱為外部節點,其餘節點稱為內部節點。
每個節點被染成紅色或黑色。其中
需要滿足的性質:
稱從節點 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張圖帶你徹底理解紅黑樹 因為從這裡開始,是自己的學習筆記,從上面提到的文章中學習總結的,主要是為了給自己看,記錄哈,容易忘記,純概念,可能比較苦...