數(shù)據(jù)結(jié)構(gòu)與算法:紅黑樹插入調(diào)整方案
紅黑樹插入有五種情況,每種情況對(duì)應(yīng)著不同的調(diào)整方法:
一、 新結(jié)點(diǎn)(A)位于樹根,沒有父結(jié)點(diǎn)。
直接讓新結(jié)點(diǎn)變色為黑色,規(guī)則2得到滿足。同時(shí),黑色的根結(jié)點(diǎn)使得每條路徑上的黑色結(jié)點(diǎn)數(shù)目 都增加了1,所以并沒有打破規(guī)則5。
二、 新結(jié)點(diǎn)(B)的父結(jié)點(diǎn)是黑色
新插入的紅色結(jié)點(diǎn)B并沒有打破紅黑樹的規(guī)則,所以不需要做任何調(diào)整
三、 新結(jié)點(diǎn)(D)的父結(jié)點(diǎn)和叔叔結(jié)點(diǎn)都是紅色
兩個(gè)紅色結(jié)點(diǎn)B和D連續(xù),違反了規(guī)則4。因此我們先讓結(jié)點(diǎn)B變?yōu)楹谏?/p>
這樣一來(lái),結(jié)點(diǎn)B所在路徑憑空多了一個(gè)黑色結(jié)點(diǎn),打破了規(guī)則5。因此我們讓結(jié)點(diǎn)A變?yōu)榧t色
結(jié)點(diǎn)A和C又成為了連續(xù)的紅色結(jié)點(diǎn),我們?cè)僮尳Y(jié)點(diǎn)C變?yōu)楹谏?/p>
四、 新結(jié)點(diǎn)(D)的父結(jié)點(diǎn)是紅色,叔叔結(jié)點(diǎn)是黑色或者沒有叔叔,且新結(jié)點(diǎn)是父結(jié)點(diǎn)的右孩子,父結(jié) 點(diǎn)(B)是祖父結(jié)點(diǎn)的左孩子
我們以結(jié)點(diǎn)B為軸,做一次左旋轉(zhuǎn),使得新結(jié)點(diǎn)D成為父結(jié)點(diǎn),原來(lái)的父結(jié)點(diǎn)B成為D的左孩子
這樣進(jìn)入了情況5。
五、新結(jié)點(diǎn)(D)的父結(jié)點(diǎn)是紅色,叔叔結(jié)點(diǎn)是黑色或者沒有叔叔,且新結(jié)點(diǎn)是父結(jié)點(diǎn)的左孩子,父結(jié) 點(diǎn)(B)是祖父結(jié)點(diǎn)的左孩子
我們以結(jié)點(diǎn)A為軸,做一次右旋轉(zhuǎn),使得結(jié)點(diǎn)B成為祖父結(jié)點(diǎn),結(jié)點(diǎn)A成為結(jié)點(diǎn)B的右孩子
接下來(lái),我們讓結(jié)點(diǎn)B變?yōu)楹谏?,結(jié)點(diǎn)A變?yōu)榧t色。
經(jīng)過(guò)上面的調(diào)整,這一局部重新符合了紅黑樹的規(guī)則。