紅黑樹(shù)的插入刪除

知識(shí)前提:二叉查找樹(shù) 平衡二叉樹(shù)

寫(xiě)的很簡(jiǎn)單,有點(diǎn)亂剛學(xué)了整理一下,算自己的一點(diǎn)筆記。把握從下至上的思想。

性質(zhì)

紅黑樹(shù)是一種含有紅黑結(jié)點(diǎn)并能保持平衡的二叉查找樹(shù)。它必須滿足下面性質(zhì):

性質(zhì)1:每個(gè)結(jié)點(diǎn)要么是黑色,要么是紅色。

性質(zhì)2:根結(jié)點(diǎn)是黑色。

性質(zhì)3:每個(gè)空結(jié)點(diǎn)是黑色。

性質(zhì)4:每個(gè)紅色結(jié)點(diǎn)的兩個(gè)子結(jié)點(diǎn)一定都是黑色。(黑結(jié)點(diǎn)的子結(jié)點(diǎn)則不一定)

性質(zhì)5:從一個(gè)節(jié)點(diǎn)到該節(jié)點(diǎn)的子孫節(jié)點(diǎn)的所有路徑上包含相同數(shù)目的黑節(jié)點(diǎn)。


對(duì)結(jié)點(diǎn)的操作

左旋:以某個(gè)結(jié)點(diǎn)作為支點(diǎn)(旋轉(zhuǎn)結(jié)點(diǎn)),其右子結(jié)點(diǎn)變?yōu)樾D(zhuǎn)結(jié)點(diǎn)的父結(jié)點(diǎn),右子結(jié)點(diǎn)的左子結(jié)點(diǎn)變?yōu)樾D(zhuǎn)結(jié)點(diǎn)的右子結(jié)點(diǎn),左子結(jié)點(diǎn)保持不變。左旋中的“左”,意味著“被旋轉(zhuǎn)的節(jié)點(diǎn)將變成一個(gè)左節(jié)點(diǎn)”。

右旋:以某個(gè)結(jié)點(diǎn)作為支點(diǎn)(旋轉(zhuǎn)結(jié)點(diǎn)),其左子結(jié)點(diǎn)變?yōu)樾D(zhuǎn)結(jié)點(diǎn)的父結(jié)點(diǎn),左子結(jié)點(diǎn)的右子結(jié)點(diǎn)變?yōu)樾D(zhuǎn)結(jié)點(diǎn)的左子結(jié)點(diǎn),右子結(jié)點(diǎn)保持不變。右旋中的“右”,意味著“被旋轉(zhuǎn)的節(jié)點(diǎn)將變成一個(gè)右節(jié)點(diǎn)”。

變色:結(jié)點(diǎn)的顏色由紅變黑或由黑變紅。


查找過(guò)程和二叉樹(shù)一致

插入

查找插入位置后,將插入的結(jié)點(diǎn)著色為紅色,(不會(huì)違背"特性(5)"!少違背一條特性,就意味著我們需要處理的情況越少。)

平衡

使插入點(diǎn)后依舊滿足性質(zhì),插入只可能改變性質(zhì)性質(zhì)2或4或5。

思路:將紅色的節(jié)點(diǎn)移到根節(jié)點(diǎn);然后,將根節(jié)點(diǎn)設(shè)為黑色,基于性質(zhì)5.

所有的情況見(jiàn)圖:

祖宗根節(jié)點(diǎn)必黑,允許黑連黑,不允許紅連紅;新增紅色,爸叔通紅就變色,爸紅叔黑就旋轉(zhuǎn),那黑往那旋



刪除

????????刪除其實(shí)是由簡(jiǎn)到繁,用替代結(jié)點(diǎn)代替刪除結(jié)點(diǎn),然后刪除替代結(jié)點(diǎn),后面的情況都會(huì)在過(guò)程中轉(zhuǎn)換成前面的情況。也可以說(shuō)是從樹(shù)葉到樹(shù)根的一步步替換。

0度點(diǎn)直接刪除;

1度點(diǎn)刪除后用子結(jié)點(diǎn)代替;

2度點(diǎn)刪除后,用左子樹(shù)最大結(jié)點(diǎn)(即最右)或右子樹(shù)最?。醋钭螅┙Y(jié)點(diǎn)代替;


????????替換后,因?yàn)閯h除結(jié)點(diǎn)之后,可能會(huì)違背紅黑樹(shù)的特性。所以需要通過(guò)旋轉(zhuǎn)和變色來(lái)修正該樹(shù),使之重新成為一棵紅黑樹(shù)。

????????記刪除結(jié)點(diǎn)的替換之前和替換之后的顏色為X,易得X只有“黑紅”,“黑黑”兩種情況,看看性質(zhì),只有刪除黑色結(jié)點(diǎn)才能影響性質(zhì)進(jìn)入平衡模式,刪除紅色結(jié)點(diǎn)會(huì)不會(huì)影響性質(zhì),(只有刪除紅色的葉子節(jié)點(diǎn)這種情況)。一切從簡(jiǎn),刪除黑色結(jié)點(diǎn)后首先自我解決(看替代結(jié)點(diǎn)能否維持平衡),接著找兄弟借紅變黑

????????具體情況如下(p為替代結(jié)點(diǎn),可為空,此時(shí)為直接刪除葉子結(jié)點(diǎn))沒(méi)說(shuō)的都是不可能出現(xiàn)的情況。


????????一切從簡(jiǎn),刪除黑色結(jié)點(diǎn)后首先自我解決(看替代結(jié)點(diǎn)能否維持平衡),接著找兄弟借紅變黑,再不行向上反應(yīng),直至根結(jié)點(diǎn)。判斷的時(shí)候,先看待刪除的節(jié)點(diǎn)的顏色,再看兄弟節(jié)點(diǎn)的顏色,再看侄子節(jié)點(diǎn)的顏色(侄子節(jié)點(diǎn)先看遠(yuǎn)侄子再看近侄子)遠(yuǎn)侄子紅,近侄子無(wú)所謂,遠(yuǎn)侄子黑近侄子紅,最后看父親節(jié)點(diǎn)的顏色(重要性排序)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容