1. 程式人生 > 其它 >紅黑樹原理、查詢效率、插入及變化規則分析

紅黑樹原理、查詢效率、插入及變化規則分析

目錄

引言

在文章《各種查詢演算法的選用分析(順序查詢、二分查詢、二叉平衡樹、B樹、紅黑樹、B+樹)》中我們分析過,紅黑樹的本質其實就是對概念模型:階數為4的B樹——“2-3-4樹”的一種實現,也能從文章中看出選用紅黑樹的優點。

下面我們分析一下為什麼紅黑樹的本質其實就是對概念模型:階數為4的B樹——“2-3-4樹”的一種實現。

和2-3-4樹的關係

2-3-4樹就是階數為4的B樹。紅黑樹是對概念模型2-3-4樹的一種實現,由於直接進行不同節點間的轉化會造成較大的開銷,所以選擇以二叉樹為基礎,在二叉樹的屬性中加入一個顏色屬性來表示2-3-4樹中不同的節點。2-3-4樹到紅黑樹的轉化過程:

舉個例子,對比一下插入過程就更加能體會2-3-4樹和紅黑樹的關係了。分別向紅黑樹、2-3-4樹依次插入2、3、4、5、6、7

紅黑樹

定義

紅黑樹需要滿足如下四個要求:

  1. 根節點是黑色的;
  2. 每個葉子節點都是黑色的空節點,也就是說,葉子節點不儲存資料;
  3. 任何相鄰的節點都不能同時為紅色,也就是說,紅色節點是被黑色節點隔開的;
  4. 每個節點,從該節點到達其可達葉子節點的所有路徑,都包含相同數目的黑色節點

通過對2-3-4樹和紅黑樹關係的講解,其實就可以體會到,紅黑樹定義中的這四個要求,其實就是為了讓紅黑樹始終是變形的2-3-4樹。

  • 黑色節點對應的就是每個2-3-4樹節點中間的那個鍵值
    • 三個鍵值的中間:(0+2)/2=1
    • 兩個鍵值的中間:(0+1)/2=0
  • 紅色節點對應的就是每個2-3-4樹節點兩邊的那個鍵值

所以不可能有兩個連續的紅色節點根節點必須是黑色每個節點,從該節點到達其可達葉子節點的所有路徑,都包含相同數目的黑色節點

再體會下紅黑樹和2-3-4樹的對應關係:

Case 含義
父子都是黑色節點 代表的是2-3-4樹中,上一層節點的中間鍵值指向下一層的中間鍵值
父是黑色節點,子是紅色 代表的是2-3-4樹中,同一個節點中的中間鍵值指向兩邊鍵值
父是紅色節點,子是黑色 代表的是2-3-4樹中,上層節點中的兩邊鍵值指向下一層的中間鍵值

紅黑樹的查詢效率

通過分析紅黑樹和2-3-4樹的關係,其實大概就能體會到紅黑樹的查詢效率應該是和B樹差不多的(畢竟B樹中,找到一個節點後,往下應該順著哪個分支找,也是要通過計算的)。
接下來我們再具體地分析一下紅黑樹的查詢效率。如果把紅黑樹中的所有紅色節點拿掉,然後拿這些節點的爺爺節點作為父節點,你會發現,它變成了一個4階平衡樹。

原因是這條定義:每個節點,從該節點到達其可達葉子節點的所有路徑,都包含相同數目的黑色節點

所以變換後的樹的查詢的效率為。我們現在知道只包含黑色節點的“黑樹”的高度,那我們現在把紅色節點加回去,高度會變成多少呢?
因為任何相鄰的節點都不能同時為紅色,所以紅色節點不能相鄰,也就是說,有一個紅色節點就要至少有一個黑色節點,將它跟其他紅色節點隔開。所以加入紅色節點後,即使樹高變成了兩倍,那麼查詢的效率也不會高於。

紅黑樹的插入及變化規則

插入及變化規則

在極客時間中老師用了魔方的例子來講解其思想,我覺得很恰當.這裡直接拿來用

不知道你有沒有玩過魔方?其實魔方的復原解法是有固定演算法的:遇到哪幾面是什麼樣子,對應就怎麼轉幾下。你只要跟著這個復原步驟,就肯定能將魔方復原。

實際上,紅黑樹的平衡過程跟魔方復原非常神似,大致過程就是:遇到什麼樣的節點排布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將一個非平衡的紅黑樹調整成平衡的。

新插入的節點必須為紅色
所以如果父節點是黑色的話,插入後還是滿足紅黑樹定義,
不需要調整。如果沒有父節點,或者父節點為紅色,則分為以下四種需要調整的情況:

情況 調整方式 調整步驟 舉例
1.沒有父節點(當前節點為紅黑樹的根節點) 變色 將該紅色節點變成黑色
當前節點的父親是紅色,且它的叔叔節點也是紅色 變色 1. 把父節點、叔叔節點設為黑色
2. 把爺爺節點設為紅色
例子1
1. 當前父節點是紅色,叔叔節點是黑色
2. 當前的節點是右子樹
左旋 以父節點作為根節點左旋 例子2
1. 當前父節點是紅色,叔叔節點是黑色
2. 當前的節點是左子樹
右旋 以父節點作為根節點右旋 例子3

如果每次調整後,如果調整後的樹不符合紅黑樹定義,則繼續根據上述4種情況調整,直至成為合格的紅黑樹。

例子1

情況:

  • 當前節點的父親是紅色,且它的叔叔節點也是紅色

調整:變色

  1. 把父節點、叔叔節點設為黑色
  2. 把爺爺節點設為紅色

例子2

情況:

  1. 當前父節點是紅色,叔叔節點是黑色
  2. 當前的節點是右子樹

調整:左旋

  • 以父節點作為根節點左旋

例子3

情況:

  1. 當前父節點是紅色,叔叔節點是黑色
  2. 當前的節點是左子樹

調整:左旋

  • 以父節點作為根節點右旋

紅黑樹的插入及變化規則,對應在2-3-4樹中是什麼操作?

1. 新插入的節點必須為紅色

其實向B樹中插入節點時,也是這樣的過程,先把鍵值放到對應的節點上,然後看節點的鍵值是否超過最大的鍵值數

2. 沒有父節點(當前節點為紅黑樹的根節點)

3. 當前節點的父親是紅色,且它的叔叔節點也是紅色

是不是對應了變色的過程?

4. 當前父節點是紅色,叔叔節點是黑色;當前的節點是右子樹

是不是對應了左旋的過程?

5. 當前父節點是紅色,叔叔節點是黑色;當前的節點是左子樹

是不是對應了右旋的過程?

參考資料