1. 程式人生 > >紅黑樹的插入解析

紅黑樹的插入解析

以下講解參考演算法導論:

首先回顧一下紅黑樹的性質:

1、紅黑樹的所有結點顏色是紅色或者黑色。

2、根結點是黑色

3、葉結點都為黑色

4、紅色節點的左右孩子結點為黑色(推論:紅色節點的父結點一定為黑色)

5、從樹中的任意一個結點出發,到葉結點所有路徑上黑色結點的個數相同。如根結點到葉結點有多條路徑,每條路徑上的黑色結點數一樣。同理,其他結點也一樣。

接下來進行插入結點的操作。

(1)首先要知道,紅黑樹的插入是按照二叉排序樹的插入方式進行插入的。

(2)插入後紅黑樹的5個性質可能發生改變,所以要進行調整。另外要明確一點,紅黑樹插入新結點必須為紅色,因為插入紅色節點相比插入黑色結點對紅黑樹的性質更小。接下來,我們分析哪些性質發生了變化,才能知道如何進行調整。

分析:

1性質不可能發生變化。

2性質可能發生變化。當原來為空樹時,插入一個新節點,這個新節點就是根結點且為紅色。對於這種情況比較簡單,只需要把顏色改成黑色就可以了。

3性質不會發生變化。

4性質可能會發生變化。當插入結點的父結點為紅色時。這種情況也是我們接下來唯一要討論的。

5性質不會發生變化。因為插入的是紅色結點對黑高沒有影響。

 

對於4性質改變我們還需要細分情況。參考下圖和文字說明

說明:圖中淺顏色的結點代表紅色,深顏色的結點代表黑色。

情況1:如圖中情況1,新插入結點4為紅色,父結點5也是紅色,叔叔結點8也為紅色,則5、8節點變為黑7變為紅。若祖父2位黑則結束。若祖父2為紅(圖中情況2)則又產生了性質4的違背,需要繼續調整。若7的兄弟結點(圖中看不清編號)為紅色,接下來的調整就是把2看成新插入的結點重複情況1;若7的兄弟結點是黑色,這時就是我們遇到的情況2.

情況2:如圖情況2,新插入結點7,父結點2都是紅色,7的叔叔結點(圖中2的左孩子)為黑色,這時我們要對2節點進行左旋操作,這樣我們就可以變成情況3了。

情況3:為什麼要變成情況3呢?因為情況2中新插入結點是父結點的右孩子,變成情況3以後,就變成了一個紅色節點是另一個紅色節點的左孩子了(當然父子關係也發生了變化,但是不影響,我們可以把原來的父結點2看成新插入結點)。總結一下情況3:新插入結點是父結點的左孩子,新插入結點和父結點都是紅色,叔叔結點是黑色。這時我們要對祖父結點(父結點的父結點,在圖中正好是根節點)進行右旋操作,右旋以前(以後也一樣)父結點2和祖父節點(圖中根節點)顏色變為自身相反色。第四個圖是變後的結果。

差不多就這樣了,最後把虛擬碼貼上: