紅黑樹是每一個節點都帶有顏色屬性的二叉查找樹,顏色爲紅色或黑色。在二叉查找樹強制通常要求之外,對於任何有效的紅黑樹咱們增長了以下的額外要求:遞歸
性質1. 節點是紅色或黑色。ip
性質2. 根是黑色。im
性質3. 全部葉子都是黑色(葉子是NIL節點)。margin
性質4. 每一個紅色節點必須有兩個黑色的子節點。(從每一個葉子到根的全部路徑上不能有兩個連續的紅色節點。)img
性質5. 從任一節點到其每一個葉子的全部簡單路徑都包含相同數目的黑色節點。紅黑樹
插入旋轉di
令插入的新節點爲N,N的父節點爲P,祖父節點爲G,叔父節點爲U,插入時N爲紅色,當P爲黑色時沒問題,插入旋轉的緣由是紅紅衝突,即N和P都爲紅色,旋轉的關鍵在於U的顏色和N在左子樹還右子樹;display
情形(1),U=紅,令(P,U)=(黑,黑),G=紅,結束,此時U在左子樹or右子樹無所謂;block
情形(2),U=黑,N在左子樹,右旋轉便可,P=黑,G=紅;結束顏色
情形(3),U=黑,N在右子樹,對P子樹執行左旋轉,變爲情形(2);
插入操做最多旋轉二次,是在第二種情形下;
綜上所述,插入旋轉的關鍵在叔父節點的顏色,和插入節點的左右位置;
刪除旋轉
若是須要刪除的節點有兩個兒子,那麼問題能夠被轉化成刪除另外一個只有一個兒子的節點的問題,當待刪除節點和孩子節點有一個爲紅色,易解;難點在於待刪除和兒子節點都爲黑色,刪除後用孩子節點代替,這課子樹高度減一,令被代替後的的節點爲N,父節點爲P,兄弟節點爲S,S的左右孩子節點爲SL和SR,此時已知h(N)=h-1,h(S)=h,即P的左子樹高度比右子樹少一,N必定爲黑色,N爲當前節點,因爲P的左右黑高不平衡須要根據如下狀況旋轉:
情形(1) 當(P, S, SL,SR)= (黑,紅,*,*)時,這時,因爲紅黑樹的的固有性質,後兩個*也必定爲黑。對當前樹進行左旋以下圖,此時P子樹仍不平衡,但問題轉爲情形(3)(4)(5),仍是以N爲當前節點;
情形(2) 當(P, S, SL,SR)=(黑,黑,黑,黑)時,令S=紅,P子樹平衡,但高度減一,以P爲當前節點向上遞歸;
情形(3) 當(P, S, SL,SR)=(紅,黑,黑,黑)時,令P=黑,S=紅;平衡結束;
注:剩下的情形(黑,黑,紅,黑)、(黑,黑,黑,紅)/(紅,黑,紅,黑)、(紅,黑,黑,紅)歸結爲(*,黑,紅,黑)和(*,黑,黑,紅);
情形(4) 當(P, S, SL,SR)=(*,黑,紅,黑)時,在S子樹上執行右旋轉,轉爲情形(5),下圖未畫出N和P;
情形(5) 當(P, S, SL,SR)=(*,黑,黑,紅)時,執行左旋轉,完畢
刪除操做最多旋轉三次,旋轉序列是(1)(4)(5);
紅黑樹的刪除旋轉到此結束,刪除旋轉關鍵是看(P,S,SL,SR)的各類組合;
參考:http://zh.wikipedia.org/wiki/紅黑樹