本篇目錄
****************************************************************************
紅黑樹的概念及性質
利用圖示法介紹紅黑樹的插入是怎麼實現的
*****************************************************************************
一、紅黑樹的基本性質
(1)、紅黑樹是在每個結點上增加一個存儲位來保存節點顏色的一種二叉搜索樹,保存顏色的存儲位可以是黑色也可以是紅色。
(2)、紅黑樹是接近平衡的。因爲通過對任何一條從根到葉子的路徑上各個節點着色方式的限制,紅黑樹確保沒有一條路徑會比其他路徑長出兩倍。
(3)、每個節點包含五個域(如下圖):
如果一個結點沒有leftchild或者rightchild或者parent域,那就用NULL來表示。
(4)、紅黑樹的性質:
<1>、每個節點或是紅的、或是黑的。 <2>、根結點是黑的。 <3>、每個葉結點是黑的。 <4>、如果一個結點是紅的,則它的兩個兒子都是黑的。 <5>、對每個結點,從該結點到其子孫結點的所有路徑上包含相同數目的黑結點。 |
二、紅黑樹的插入是怎麼實現的?
爲了便於處理紅黑樹代碼中的邊界條件,採用一個哨兵來代表NULL,它的color域是黑的,其餘parent、leftchild、rightchild、key域可設置成任意值。
先簡單的畫一顆樹來說明一下幾個”稱呼“,結點顏色還沒確定。
下面來講一下紅黑樹的插入過程:
第一步:紅黑樹的結點插入默認是紅色的。根結點始終爲黑色。(黑色也可以,但是會增加路徑上的黑色結點,很容易破壞性質五,調整很麻煩,所以選擇紅色)
第二步:插入紅色結點,
2.1:如果父結點爲黑色,紅黑樹性質繼續保持,操作完成。
2.2:如果父結點爲紅色時,需要修正(破壞了性質4),
2.2.1:當叔父結點爲紅色時:將父結點和叔父結點變爲黑色,祖父結點變爲紅色。由於有可能祖父結點的父結點有可能爲紅色,依舊會破壞紅黑樹的性質,此時需要將祖父結點作爲新插入的結點繼續向上迭代進行平衡操作,在迭代時如果調整到根,根依舊要保持爲黑色結點。
2.2.2:當叔父結點爲黑色時:需要進行旋轉。
接着來用一組數據進行示例:
依次插入10,85,15,70,20,60,30,50,65,80,90,5,55這一組數。用畫圖的形式進行每一步的解釋。(在下面插入過程中沒有將哨兵結點畫入,但是它是存在的!)注:綠色標註表示的是執行的上面的哪一步操作。
emmmmm,畫完整個圖之後現在眼裏全是小紅圈和小黑圈^w^.
最後由這一組數據形成的紅黑樹應該長成如下圖這樣:
紅黑樹的插入圖示法就先講到這。