性質(zhì)
紅黑樹的結(jié)點都是紅色或者黑色
根結(jié)點是黑色
所有葉子都是黑色(這里的葉子結(jié)點是空結(jié)點)
每個紅色結(jié)點必須有兩個黑色的子結(jié)點
從任何一個節(jié)點到其每個葉子的所有簡單路徑都包含相同數(shù)目的黑色結(jié)點
性質(zhì)1和性質(zhì)3總是能夠保持著;
性質(zhì)4只有在這些情況下才會發(fā)生作用:
增加紅色結(jié)點
將黑色結(jié)點重新繪制成紅色結(jié)點
旋轉(zhuǎn)
性質(zhì)5在這些情況下才會發(fā)生作用:
增加黑色結(jié)點
將紅色結(jié)點重新繪制黑色結(jié)點
旋轉(zhuǎn)
舉例:
插入
用BST的方法將結(jié)點插入,將該結(jié)點標(biāo)記為紅色的(因為如果標(biāo)記為黑色,則會導(dǎo)致根結(jié)點到葉子結(jié)點的路徑會多出一個黑結(jié)點,無法滿足性質(zhì)5,而且不容易進行調(diào)整),插入的情況包括下面幾種:
插入到一個空的樹,插入結(jié)點則為根結(jié)點,只需要將紅色結(jié)點重新轉(zhuǎn)染成黑色結(jié)點來滿足性質(zhì)2;
新結(jié)點的父結(jié)點為黑色,滿足所有條件;
新結(jié)點的父結(jié)點為紅色,因為性質(zhì)2和性質(zhì)4,所以樹必然有祖父結(jié)點,則又包括以下的情況:
新插入結(jié)點為父親結(jié)點的左子結(jié)點,那么就構(gòu)成了一個左左的情況,在之前平衡樹中提到過,如果要將其進行平衡,則需要對父結(jié)點進行一次單右旋轉(zhuǎn),形成一個父親結(jié)點為相對根結(jié)點,子結(jié)點和祖父結(jié)點為子結(jié)點的樹,同時將父親結(jié)點的紅色改為黑色,祖父結(jié)點更改為紅色,這下之前無法滿足的性質(zhì)4和性質(zhì)5就滿足了;
新插入結(jié)點為父親結(jié)點的右子結(jié)點,那么就會構(gòu)成一個左右的情況,在之前的平衡樹也提到過要進行一次雙旋轉(zhuǎn),先對新結(jié)點進行一次單左旋轉(zhuǎn),變成了左左的結(jié)構(gòu),再進行一次單右旋轉(zhuǎn),從而達(dá)到滿足所有性質(zhì);
父親結(jié)點和叔父結(jié)點均為紅色,顯然無法滿足性質(zhì)4,則將父親結(jié)點和叔父結(jié)點繪制成黑色,祖父結(jié)點設(shè)置成紅色,但是仍然無法滿足情況,比如考慮到祖父結(jié)點可能是根結(jié)點,則無法滿足性質(zhì)2,或者祖父結(jié)點的父結(jié)點是紅色的,則無法滿足性質(zhì)4,這時需要將祖父結(jié)點作為新的結(jié)點來看待進行各種情況的判斷,涉及到對祖父結(jié)點的遞歸;
父親結(jié)點為紅色同時叔父結(jié)點為黑色或者從缺,這里又分為