紅黑樹的插入刪除

所有偷的懶總是要還的

紅黑樹作為一個平衡二叉樹廣泛應(yīng)用在軟件系統(tǒng)中衰猛,比如內(nèi)核的vma結(jié)構(gòu)。

之前偷懶沒有徹底理解刹孔,這里做一下最近學(xué)習(xí)的筆記腕侄。

插入

按照正常的二叉樹插入,并給節(jié)點上色為紅色后芦疏。這么做將可能導(dǎo)致該節(jié)點和父節(jié)點同為紅色,顧需要重新平衡微姊。

如下的偽代碼展示了高度抽象了當(dāng)父節(jié)點為爺爺節(jié)點左孩子時的三種情況酸茴。

RB-INSERT-FIXUP(T, c)
1. while color[p[c]] = RED
2.     if p[c] = left[p[p[c]]]               // parent is left child of gp 
3.         then uncle = right[p[p[c]]]
4.             if color[uncle] = RED         // uncle is RED
5.                 then <Case 1>
6.             else if c = right[p[c]]       // child is left
7.                 then <Case 2>
8.                 <Case 3>

注釋:

  • 循環(huán)判斷條件為父節(jié)點是紅色
  • Case 1表明 c, p, u同時為紅色,且因為gp必須為黑色兢交,處理方式是將紅色節(jié)點上移
  • Case 2是一個中間過程薪捍,目的是通過旋轉(zhuǎn)變換成Case 3
  • Case 3是c, p, gp在同一直線上,且c,p為紅色酪穿,gp為黑色凳干,通過旋轉(zhuǎn)將這一分支上多余的紅色轉(zhuǎn)移到了gp的另一個分支上
  • Case 1 是唯一不能確定是否終結(jié)的情況,Case 2,3是終結(jié)情況
插入操作的三種情況

嘗試歸納一下插入過程中的平衡步驟:

在父節(jié)點是紅色的前提下:如果叔叔節(jié)點是紅色被济,則父親和叔叔繼承爺爺?shù)暮谏却停瑢⒓t色節(jié)點上移到爺爺節(jié)點;如果叔叔節(jié)點是黑色只磷,則通過旋轉(zhuǎn)將父親上升為爺爺并交換父親和爺爺?shù)念伾酰辜t色轉(zhuǎn)移到爺爺節(jié)點。

刪除

按照正常二叉樹刪除钮追,然后進(jìn)行平衡预厌。

RB-DELETE-FIXUP(T, c)
1. while c != root[T] and color[x] = BLACK
2.     do if c = left[p[c]]                 // c is left child
3.         then s = right[p[c]]
4.             if color[s] = RED            // sibling is red
5.                 then <Case 1>
6.             if color[left[s]] = BLACK and color[left[s]] = BLACK
7.                 then <Case 2>            // both nephews are black 
8.                 else if color[right[s]] = BLACK
9.                         then <Case 3>   // right nephew is black
10.                        <Case 4>           // right nephew is red

注釋:

  • 循環(huán)判斷條件為自己不是根且顏色是黑色
  • Case 1,兄弟為紅色元媚,則通過旋轉(zhuǎn)轧叽,讓兄弟變成黑色
  • Case 2,侄子都是黑色刊棕,只好上移黑色節(jié)點炭晒。如果原父節(jié)點是紅色,則多余的黑色被吸收鞠绰。否則父節(jié)點轉(zhuǎn)化為新節(jié)點腰埂。
  • Case 3,離自己近的侄子是紅色蜈膨,通過旋轉(zhuǎn)將紅色轉(zhuǎn)到離自己遠(yuǎn)的侄子
  • Case 4屿笼,離自己遠(yuǎn)的侄子是紅色,通過旋轉(zhuǎn)將多余的黑色吸收
刪除操作的四種情況

嘗試歸納一下刪除過程的平衡步驟:

刪除的平衡操作在自身和兄弟及侄子之間進(jìn)行:如果兄弟不是黑色翁巍,則先把它變黑驴一;如果兄弟是黑色且兩個侄子也是黑色,則只能上移多余的黑色灶壶;如果兄弟是黑色且其中有一個侄子是紅色肝断,則能通過旋轉(zhuǎn)將多余的黑色吸收。

參考

紅黑樹(刪除)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驰凛,一起剝皮案震驚了整個濱河市胸懈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恰响,老刑警劉巖趣钱,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異胚宦,居然都是意外死亡首有,警方通過查閱死者的電腦和手機(jī)燕垃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來井联,“玉大人卜壕,你說我怎么就攤上這事±映#” “怎么了轴捎?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長军掂。 經(jīng)常有香客問我轮蜕,道長,這世上最難降的妖魔是什么蝗锥? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任跃洛,我火速辦了婚禮,結(jié)果婚禮上终议,老公的妹妹穿的比我還像新娘汇竭。我一直安慰自己,他們只是感情好穴张,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布细燎。 她就那樣靜靜地躺著,像睡著了一般皂甘。 火紅的嫁衣襯著肌膚如雪玻驻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天偿枕,我揣著相機(jī)與錄音璧瞬,去河邊找鬼。 笑死渐夸,一個胖子當(dāng)著我的面吹牛嗤锉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播墓塌,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瘟忱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了苫幢?” 一聲冷哼從身側(cè)響起访诱,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎韩肝,沒想到半個月后盐数,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡伞梯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年玫氢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谜诫。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡漾峡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出喻旷,到底是詐尸還是另有隱情生逸,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布且预,位于F島的核電站槽袄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏锋谐。R本人自食惡果不足惜遍尺,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涮拗。 院中可真熱鬧乾戏,春花似錦、人聲如沸三热。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽就漾。三九已至呐能,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抑堡,已是汗流浹背摆出。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留夷野,地道東北人懊蒸。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像悯搔,于是被迫代替她去往敵國和親骑丸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容