15紅黑樹透徹理解

2021-10-05 05:42:26 字數 2435 閱讀 9907

漫畫紅黑樹參考:

首先了解幾個基本概念:

紅黑樹也是二叉查詢樹,我們知道,二叉查詢樹這一資料結構並不難,而紅黑樹之所以難是難在它是自平衡的二叉查詢樹,在進行插入和刪除等可能會破壞樹的平衡的操作時,需要重新自處理達到平衡狀態。

紅黑樹是一種含有紅黑結點並能自平衡的二叉查詢樹。它必須滿足下面性質:

上面所說的旋轉結點也即旋轉的支點,圖4和圖5中的p結點。

我們先忽略顏色,可以看到旋轉操作不會影響旋轉結點的父結點,父結點以上的結構還是保持不變的

左旋只影響旋轉結點和其右子樹的結構,把右子樹的結點往左子樹挪了

右旋只影響旋轉結點和其左子樹的結構,把左子樹的結點往右子樹挪了

所以旋轉操作是區域性的。另外可以看出旋轉能保持紅黑樹平衡的一些端詳了:當一邊子樹的結點少了,那麼向另外一邊子樹「借」一些結點;當一邊子樹的結點多了,那麼向另外一邊子樹「租」一些結點。

但要保持紅黑樹的性質,結點不能亂挪,還得靠變色,紅黑樹總是通過旋轉和變色達到自平衡

因為紅黑樹是一顆二叉平衡樹,並且查詢不會破壞樹的平衡,所以查詢跟二叉平衡樹的查詢無異:

從根結點開始查詢,把根結點設定為當前結點;

插入操作包括兩部分工作:一查詢插入的位置;二插入後自平衡。查詢插入的父結點很簡單,跟查詢操作區別不大:

所有插入情景如圖7所示。

根據二叉樹的性質,除了情景2,所有插入操作都是在葉子結點進行的。這點應該不難理解,因為查詢插入位置時,我們就是在找子結點為空的父結點的。

在開始每個情景的講解前,我們還是先來約定下,如圖8所示。

下面讓我們乙個乙個來分析每個插入的情景以其處理。

最簡單的一種情景,直接把插入結點作為根結點就行,但注意,根據紅黑樹性質2:根節點是黑色。還需要把插入結點設為黑色。

處理:把插入結點作為根結點,並把結點設定為黑色

插入結點的key已存在,既然紅黑樹總保持平衡,在插入前紅黑樹已經是平衡的,那麼把插入結點設定為將要替代結點的顏色,再把結點的值更新就完成插入。

處理

由於插入的結點是紅色的,當插入結點的黑色時,並不會影響紅黑樹的平衡,直接插入即可,無需做自平衡。

處理:直接插入

再次回想下紅黑樹的性質2:根結點是黑色。如果插入的父結點為紅結點,那麼該父結點不可能為根結點,所以插入結點總是存在祖父結點。這點很重要,因為後續的旋轉操作肯定需要祖父結點的參與。

情景4又分為很多子情景:

插入情景4.1:叔叔結點存在並且為紅結點

從紅黑樹性質4可以,祖父結點肯定為黑結點,因為不可以同時存在兩個相連的紅結點。那麼此時該插入子樹的紅黑層數的情況是:黑紅紅。顯然最簡單的處理方式是把其改為:紅黑紅。如圖9和圖10所示。

處理

可以看到,我們把pp結點設為紅色了,如果pp的父結點是黑色,那麼無需再做任何處理;但如果pp的父結點是紅色,根據性質4,此時紅黑樹已不平衡了,所以還需要把pp當作新的插入結點,繼續做插入操作自平衡處理(也就是繼續該過程),直到平衡為止。

試想下pp剛好為根結點時,那麼根據性質2,我們必須把pp重新設為黑色,那麼樹的紅黑結構變為:黑黑紅。換句話說,從根結點到葉子結點的路徑中,黑色結點增加了。這也是唯一一種會增加紅黑樹黑色結點層數的插入情景

我們還可以總結出另外乙個經驗:紅黑樹的生長是自底向上的。這點不同於普通的二叉查詢樹,普通的二叉查詢樹的生長是自頂向下的。

插入情景4.2:叔叔結點不存在或為黑結點,並且插入結點的父親結點是祖父結點的左子結點

插入情景4.2.1:插入結點是其父結點的左子結點

處理

插入情景4.2.2:插入結點是其父結點的右子結點

這種情景顯然可以轉換為情景4.2.1,如圖12所示.

處理

插入情景4.3:叔叔結點不存在或為黑結點,並且插入結點的父親結點是祖父結點的右子結點

該情景對應情景4.2,只是方向反轉。

插入情景4.3.1:插入結點是其父結點的右子結點

這種情景顯然可以轉換為情景4.2.1,如圖12所示.

處理

插入情景4.3.1:插入結點是其父結點的右子結點

處理

備註:紅黑樹的刪除後續補上。

理解紅黑樹

在樹裡面的節點不是紅色的就是黑色的,沒有其他顏色,要不怎麼叫紅黑樹呢,是吧。性質二 根節點是黑色 根節點總是黑色的。它不能為紅。性質三 每個葉節點 nil或空節點 是黑色 這個可能有點理解困難,可以看圖 這個就是乙個紅黑樹,nil節點是個空節點,並且是黑色的。性質四 每個紅色節點的兩個子節點都是黑色...

紅黑樹理解

近期讀 linux核心設計與實現 第三版 清晰中文版 發現linux低層資料結構很多都用到紅黑樹,查查資料說說自己的理解。紅黑樹 二叉樹 高度限制 二叉樹 確定了它的查詢非常快。高度限制 這個是取普通二叉樹和平衡二叉樹之間。普通二叉樹,只管插入不做調整,可能會出現單鏈很長。平衡二叉樹,所有的鏈高度相...

徹底理解紅黑樹

在學習紅黑樹的時候,看了很多文章,發現都沒有講明白紅黑樹的原理,只是簡單列了紅黑樹的幾條規則,就開始講解紅黑樹的插入,讓人一直不知其所以然。也很難深刻的理解紅黑樹。最後翻起了 演算法 這本書,仔細了解了二叉樹查詢樹 2 3樹 紅黑樹,才明白了紅黑樹不是平白無故產生的,而是符合科學的發展觀念是循序漸進...