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