一次搞懂紅黑樹的插入和刪除

紅黑樹

一、產生背景

  1. BST(binary search tree 二叉搜索樹)樹的的平衡性問題:
    1. 如果插入BST中數據順序隨機,則平衡性較好。
    2. 如果插入BST中數據順序有序,則平衡性很差,是一條順序鏈。
  2. 爲了改進BST的平衡性產生了紅黑樹。

二、基本概念

  1. 紅黑樹(red-black tree,簡稱RB-tree)
  2. 紅黑樹是自平衡的BST,是BST的擴充二叉樹。
  3. 結點顏色:結點分爲“紅色”和“黑色”。
  4. 根結點:根結點永遠是“黑色”;
  5. 外部葉結點:葉結點都是擴充外部結點(Nil),葉結點都是的“黑色”結點。
  6. 內部結點:“紅”結點的兩個子結點都是“黑”,不允許兩個連續的“紅”結點。
  7. 深度特徵:任何結點到其子孫外部結點的每條簡單路徑都包含相同數目的“黑”結點(此處體現出了紅黑樹的平衡性)。
  8. 紅黑樹的
    1. 結點的階:rank,也稱“黑色高度”。
      1. 從該結點到葉結點的黑色結點數量
      2. 不包括該結點本身,包括葉結點。
      3. 葉結點的階是0。
    2. 根的階稱爲紅黑樹的階。

三、性質:

  1. 紅黑樹是擴充二叉樹,葉結點都是擴充的空結點;
  2. 階爲k的紅黑樹路徑長度最短爲k(全是黑),最長爲2k(一黑一紅)。
  3. 階爲k的紅黑樹的內部節點:內部節點數量最少時,是一個全黑的完全滿二叉樹,個數爲2k-1。
  4. 有n個內部結點的紅黑樹樹高最大爲2log2(n+1)+1

四、紅黑樹插入

  1. 先使用BST插入算法(先找到結點所在位置,將新結點作爲葉結點連接上去。如果還不明白,就需要先去了解BST的插入刪除操作);
  2. 把新結點標爲紅色,如果父結點是黑色,則結束。(紅黑樹是通過黑色結點來控制樹高,維持深度特徵,所以新插入點標爲紅色,不會影響深度特徵。)
  3. 否則,雙紅衝突,需要雙紅調整。
  4. 雙紅衝突調整:

假設當前雙紅結點爲X,父結點爲A,祖父節點爲B,叔父結點爲C,只要分析C的顏色(因爲X和A都是紅色,所以X和A的子結點都是黑色,B也爲黑色,只有C結點的顏色不確定)。

(1)情況一:C是黑色

重構:重新調整XAB結構(不會增加樹的階數。因爲C爲黑色,重構XAB後不會產生新的衝突,所以重構C)。

XAB共有4種結構,以下用具體數值“2/4/6”說明

(2)情況二:C是紅色

因爲叔父爲紅色,重構仍具有雙紅衝突,所以需要換色。

換色:父結點和叔父結點換爲黑色,祖父結點換爲紅色。換色操作會往祖先的方向傳遞,所以還要繼續平衡檢查。(只有傳遞到根結點纔會增加樹的階數)。

五、紅黑樹刪除

  1. 先調用BST的刪除算法。
    1. 如果待刪除結點的左右子結點有一個爲空,直接刪除,把子結點掛接上就行了。
    2. 如果左右子結點都不空,則和右子樹最小結點交換值(顏色不變),然後刪除。(顏色是維持樹的平衡,只與位置有關,與值無關,所以換值不換色)
  2. 再檢查平衡。
    1. 如果被刪結點是紅色,則直接刪除,結束。否則被刪結點是黑色,則進行下列調整。
    2. 如果後繼結點(掛接上來的結點)是紅色,則將此結點標爲黑色,結束。否則,如果後繼結點是黑色(Nil葉結點就是黑色結點),則進行雙黑調整,此結點稱爲雙黑結點(因爲刪掉的結點爲黑色,後繼也爲黑色,此時後繼這條路徑上就少了一個黑色結點,必須調整)。
  3. 雙黑調整:(分析兄弟和侄子的顏色)

假設雙黑結點爲X,其兄弟結點爲C,其父節點爲B,主要分析C的情況。

情況1:C爲黑色,且C子結點中有紅色(假設爲D),則D變爲黑色再重構BCD,結束。

情況2:C爲黑色,且C子結點都是黑色,則換色,C變爲紅色,B變爲黑色。如果B原來是紅色,則調整結束。如果父節點B原來爲黑色,則B變成了雙黑結點,還需要向上調整。

情況3:C爲紅色,則旋轉,C旋轉爲父節點,C繼承B的顏色,B變爲紅色。因爲C爲紅色,則C的子結點必定都是黑色,則X的新兄弟是黑色,按照情況1或2繼續調整。

六、紅黑樹性能及適用範圍

  1. 性能:查找、插入、刪除的時間代價都是logN。
  2. 適用範圍:紅黑樹適用於內存小規模的數據索引。外存或內存中大規模數據索引適用B樹或B+樹。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章