半年前在研究HashMap的時候已經學習過紅黑樹的規則原理了.
不過現在又遇到就忘記是怎麼實現的了.(只知道這玩意是用來平衡樹的)
這次就把這個數據結構做一個了斷.
性質
- 性質1:每個節點要麼是黑色,要麼是紅色。
- 性質2:根節點是黑色。
- 性質3:每個葉子節點(NIL)是黑色。
- 性質4:每個紅色結點的兩個子結點一定都是黑色。
- 性質5:任意一結點到每個葉子結點的路徑都包含數量相同的黑結點。
滿足這5個性質就能保證紅黑樹是平衡的.
Insert
插入的節點默認是紅色的.因為這樣可以最大限度滿足紅黑樹的5個性質.
請試想一下.如果插入的節點是紅色:
- 性質1可以滿足.
- 性質2可以滿足.
- 性質3可以滿足(插入紅色節點後自動衍生出2個黑色的NIL節點).
- 性質4可能沒法滿足(新插入的節點的父節點也是紅色).
- 性質5可能沒法滿足(父節點是黑色時就不行).
然後是紅黑樹節點的左右旋.


看懂沒? 節點的旋轉大概就是這樣。
然後就是要分插入的情況了.
第一種:根節點為空。這種情況,將node的顏色改為黑色即可.
第二種: node的父節點為黑色。這種情況不需要做修改.
第三種: node的父節點為紅色 (根據性質3,N的祖父節點必為黑色). 這種情況和變換規則都比較多.下面細說…
- node的叔父節點為紅色。這種情況,將N的父節點和叔父節點的顏色都改為黑色,若祖父節點是跟節點就將其改為黑色,否則將其顏色改為紅色,並以祖父節點為插入的目標節點開始重新遞歸修復紅黑樹.

- node的叔父節點為黑色,且node和node的父節點在同一邊 (即父節點為祖父的左兒子時,N也是父節點的左兒子。父節點為祖父節點的右兒子時。N也是父節點的右兒子)。以父節點為祖父節的左兒子為例,將父節點改為黑色,祖父節點改為紅色,然後以祖父節點為基準右旋。(N為父節點右兒子時做相應的左旋)

- node的叔父節點為黑色,且node和node的父節點不在同一邊 (即父節點為祖父的左兒子時,N是父節點的右兒子。父節點為祖父節點的右兒子時。N也是父節點左右兒子)。以父節點為祖父節點的左兒子為例。以父節點為基準,進行左旋,然後以父節點為目標插入節點進入情況3的b情況進行操作。

Delete
這個以後再說.
Search
紅黑樹算是搜索二叉樹的一個子集,Search方法是相同的。