紅黑樹——自平衡過程

紅黑樹的概念,這裏不作闡述。網上一抓一大把。本文僅以我的的理解介紹一下紅黑樹自平衡的過程。html

紅黑樹的性質:3d

  • 性質1:每一個節點要麼是黑色,要麼是紅色。
  • 性質2:根節點是黑色。
  • 性質3:每一個葉子節點(NIL)是黑色。
  • 性質4:每一個紅色結點的兩個子結點必定都是黑色。
  • 性質5:任意一結點到每一個葉子結點的路徑都包含數量相同的黑

自平衡所須要的操做,無非是變色,左旋,右旋。變色不用多說,黑變紅紅變黑。關於左旋,先附上網上找到的一個圖htm

 

圖片來源:http://www.360doc.com/content/18/0904/19/25944647_783893127.shtmlblog

因爲紅黑樹自己是一棵二叉搜索樹,即左子樹的全部節點值都小於本身,右子樹的全部節點值都大於本身。因而,在旋轉過程,把y提爲本子樹的根節點時,因爲y原來是x的右孩子,y > x,x成爲y的左孩子。y本來的左孩子b就得給x騰出位置,x的右節點剛好空了出來。b原爲x的右子樹成員,b > x,成爲x的右孩子很合理。圖片

關於右旋,原理相同。get

 

圖片來源:http://www.360doc.com/content/18/0904/19/25944647_783893127.shtml基礎

 

如今開始說明紅黑樹的自平衡。原理

首先是插入節點的着色。全部關於紅黑樹自平衡的介紹都說,插入的節點爲紅色。至於爲何,筆者認爲,因爲性質3與性質5,任意一結點到每一個葉子結點的路徑都包含數量相同的黑,且每一個葉子節點(NIL)是黑色。新插入的節點初始位置必爲替換某個葉子節點,同時本身又會新產生左右兩個葉子節點。若新插入的節點爲黑,則將會引發從根節點到新節點的路徑上黑色節點數量比其它路徑多了1。而插入紅色節點,則不會有此狀況,可是有可能會違反性質4,每一個紅色結點的兩個子結點必定都是黑色,出現連續的兩個紅色節點,可是不是必然發生。因此新插入的節點爲紅色,可使得須要自平衡操做的概率下降。搜索

而後,若真的出現了連續兩個紅色節點的狀況,不影響總體黑高的狀況下的調整,能大大下降調整次數。循環

在新插入一個紅節點時,除了當前是空樹外可能的狀況有:

一、其父節點爲黑色。這種狀況不會改變其父節點處的黑高,也不會打破任何性質。不用作任何處理

二、其父親節點爲紅色。因爲紅黑樹是自平衡的,在新插入一個節點以前,它已是平衡的,知足全部性質。故其祖父節點必定爲黑色。

a.其叔叔節點爲葉子節點。若爲在根節點的右孩子的左子樹上插入新節點(RL)。單純修改其父節點顏色並不能使其平衡。

 

 若直接對20,10進行左旋,則獲得

 

 又用相同方式左旋,將又會獲得初始狀態,死循環。若先對15,20進行右旋,則將會獲得RR:

此時再對10,15進行左旋,將會獲得:

 

 而後再對10,15進行變色

 

 

 此時達到平衡。LR的狀況與之相同,操做方式相反,再也不單獨敘述。而RR的狀況上面已經描述,LL與RR狀況相同,操做相同,亦不作描述。

b.其叔叔節點爲紅節點

 

 此時直接同時把父節點與叔叔節點進行變色

 

 而此時將會致使祖父節點15的黑高+1。因不肯定其是否還有父節點,爲了避免必要的麻煩,將15設置爲紅色,便可保持15的黑高不變。  

 

 說明:此處僅以15作爲某樹的子樹的根節點,並不是打破性質2。

c.其叔叔節點爲黑色節點(非葉子)此狀況在剛插入時並不存在。理由以下:每條路徑的黑色節點數量必須相同。若新插入的節點的父節點是紅色,而叔叔節點是黑色,則只能說明叔叔節點的黑高比父節點的多1。

 

現以一個簡單的實例:

向一棵紅黑樹順序插入數字1,2,3,4,5

首先,插入1,紅節點。

 

根據性質2,根節點是黑色,直接換成黑色便可。此時黑高爲2

 

 

而後插入2。並未打破5大性質,不用作任何處理。此時全部路徑的黑高爲2。

 

 

插入3以後(RR)

 

 

對3的父親節點2與祖父節點進行左旋,而後變色

 

 

 

 而後繼續插入4

 

此時再次出現相鄰紅色節點。4的父親節點3與叔叔節點1均爲紅色,此時將兩者都進行變色操做,一可保持性質4,二不會改變黑色節點之差。

 

 

 此操做以後,4的祖父節點2的黑高+1。若其爲某紅黑樹的某子樹,則會破壞平衡。故將其進行變色處理。

 

 

而後繼續以2爲基礎作自平衡。發現其已是根節點,沒有父節點,本身的子樹已達到平衡,不用繼續處理。而後根據性質2,將其設置爲黑色。此時黑高爲3。

 

繼續插入5

 

   再次出現相鄰紅色節點,狀況與插入3時相同,作相同處理

 

 現分析下列紅黑樹插入節點21的狀況。插入以前,根節點的黑高爲3。

 

 

圖片來源:http://www.360doc.com/content/18/0904/19/25944647_783893127.shtml

說明:前幾步與來源講解的有點相似,最後並不像來源處將13 17左旋了。

 

 節點21 22爲相鄰紅色節點,要對新插入的節點21的父節點22進行變色。21的叔叔節點27同爲紅色,與22同時變色,可保證21的祖父節點25保持平衡。

 

 

 

而此操做以後,將會致使25子樹黑高+1,使得其黑高比其兄弟節點多1。爲了防止這種狀況,25須要跟着色,才能保證25節點子樹的黑高不變,從而不影響整個紅黑樹的黑高。

 

 雖然總體黑高沒有發生變化,可是再次出現了相鄰紅色節點17 25。用相同策略,把8,17,13同時進行變色。

 

此時13節點的左右子樹的黑高均是3,保持平衡。且13爲根節點,沒有父節點,13的平衡表明整個紅黑樹的平衡,不用再繼續處理。  而後根據性質2,將根節點13改成黑色。

 

 

 若此時再插入節點20,則

因爲20的叔叔節點爲黑色節點,單純修改父節點爲黑色,只會致使祖父節點變得不平衡。旋轉21,22,並各自變色,就能夠達成平衡

相關文章
相關標籤/搜索