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