紅黑樹刪除規(guī)則:
1:如果刪除節(jié)點(diǎn)是葉子節(jié)點(diǎn)
(1)如果刪除節(jié)點(diǎn)是紅色的,那就直接刪除,不做其它操作
(2)如果刪除節(jié)點(diǎn)是黑色的,那么就創(chuàng)建一個(gè)空節(jié)點(diǎn)來頂替刪除節(jié)點(diǎn),然后按照后面的調(diào)整步驟進(jìn)行調(diào)整
2:如果刪除節(jié)點(diǎn)有一個(gè)子節(jié)點(diǎn),把后來頂替被刪節(jié)點(diǎn)的那個(gè)節(jié)點(diǎn)成為頂替節(jié)點(diǎn),如果刪除節(jié)點(diǎn)為黑,而且頂替節(jié)點(diǎn)也為黑,那么把頂替節(jié)點(diǎn)當(dāng)作當(dāng)前節(jié)點(diǎn),然后按照后面的調(diào)整步驟進(jìn)行調(diào)整。
3:如果刪除節(jié)點(diǎn)有兩個(gè)子節(jié)點(diǎn),那么,找到其中序后繼節(jié)點(diǎn),把這兩個(gè)節(jié)點(diǎn)的數(shù)據(jù)交換一下,不要復(fù)制顏色,也不改變其原有的父子等關(guān)系,然后重新進(jìn)行刪除。由于其中序后繼節(jié)點(diǎn)只可能是葉子節(jié)點(diǎn)或者只有一個(gè)子節(jié)點(diǎn),因此回到前面兩種情況。
紅黑樹刪除調(diào)整步驟:
1:當(dāng)前節(jié)點(diǎn)是紅,那么:直接把當(dāng)前節(jié)點(diǎn)變成黑色,結(jié)束
2:當(dāng)前節(jié)點(diǎn)是黑且是根節(jié)點(diǎn),那么:什么都不用做,結(jié)束
3:當(dāng)前節(jié)點(diǎn)是黑且兄弟節(jié)點(diǎn)為紅色,當(dāng)前節(jié)點(diǎn)為父節(jié)點(diǎn)的左子節(jié)點(diǎn),那么:把兄弟結(jié)點(diǎn)變成父節(jié)點(diǎn)的顏色,把父節(jié)點(diǎn)變成紅色,然后在父節(jié)點(diǎn)上做左旋,再重新開始判斷。
4:當(dāng)前節(jié)點(diǎn)是黑且兄弟節(jié)點(diǎn)為紅色,當(dāng)前節(jié)點(diǎn)為父節(jié)點(diǎn)的右子節(jié)點(diǎn),那么:把兄弟結(jié)點(diǎn)變成父節(jié)點(diǎn)的顏色,把父節(jié)點(diǎn)變成紅色,然后在父節(jié)點(diǎn)上做右旋,再重新開始判斷。
5:當(dāng)前節(jié)點(diǎn)是黑且父節(jié)點(diǎn)和兄弟節(jié)點(diǎn)都為黑色,兄弟節(jié)點(diǎn)的兩個(gè)子節(jié)點(diǎn)全為黑色,那么:把兄弟節(jié)點(diǎn)變紅,然后把父節(jié)點(diǎn)當(dāng)成新的當(dāng)前節(jié)點(diǎn),再重新開始判斷
6:當(dāng)前節(jié)點(diǎn)是黑且兄弟節(jié)點(diǎn)為黑色,兄弟節(jié)點(diǎn)的兩個(gè)子節(jié)點(diǎn)都是黑色,但是父節(jié)點(diǎn)是紅色,那么:就把兄弟節(jié)點(diǎn)變紅,父節(jié)點(diǎn)變黑,結(jié)束
7:當(dāng)前節(jié)點(diǎn)是黑且兄弟節(jié)點(diǎn)為黑色,兄弟節(jié)點(diǎn)的左子是紅色,右子是黑色,而且當(dāng)前節(jié)點(diǎn)是父節(jié)點(diǎn)的左子節(jié)點(diǎn),那么:把兄弟節(jié)點(diǎn)變紅,兄弟左子節(jié)點(diǎn)變黑,然后對兄弟節(jié)點(diǎn)進(jìn)行右旋,再重新開始判斷
8:當(dāng)前節(jié)點(diǎn)是黑且兄弟節(jié)點(diǎn)為黑色,兄弟節(jié)點(diǎn)的左子是黑色,右子是紅色,而且當(dāng)前節(jié)點(diǎn)是父節(jié)點(diǎn)的右子節(jié)點(diǎn),那么:把兄弟節(jié)點(diǎn)變紅,兄弟右子節(jié)點(diǎn)變黑,然后對兄弟節(jié)點(diǎn)左旋,再重新開始判斷
9:當(dāng)前節(jié)點(diǎn)是黑且兄弟節(jié)點(diǎn)為黑色,兄弟節(jié)點(diǎn)的右子是紅色,左子的顏色任意,而且當(dāng)前節(jié)點(diǎn)是父節(jié)點(diǎn)的左子節(jié)點(diǎn),那么:把兄弟節(jié)點(diǎn)變成當(dāng)前節(jié)點(diǎn)父節(jié)點(diǎn)的顏色,把當(dāng)前節(jié)點(diǎn)父節(jié)點(diǎn)變黑,兄弟節(jié)點(diǎn)右子變黑,然后以當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)為支點(diǎn)進(jìn)行左旋,結(jié)束。
10:當(dāng)前節(jié)點(diǎn)是黑且兄弟節(jié)點(diǎn)為黑色,兄弟節(jié)點(diǎn)的左子是紅色,右子的顏色任意,而且當(dāng)前節(jié)點(diǎn)是父節(jié)點(diǎn)的右子節(jié)點(diǎn),那么:把兄弟節(jié)點(diǎn)變成當(dāng)前節(jié)點(diǎn)父節(jié)點(diǎn)的顏色,把當(dāng)前節(jié)點(diǎn)父節(jié)點(diǎn)變黑,兄弟節(jié)點(diǎn)左子變黑,然后以當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)為支點(diǎn)進(jìn)行右旋,結(jié)束。