10节腐、紅黑樹

1、概念

紅黑樹也是一種自平衡的二叉搜索樹摘盆,以前也叫做平衡二叉B樹
紅黑樹必須滿足以下5條性質(zhì):
1铜跑、節(jié)點(diǎn)是RED或者BLACK
2、根節(jié)點(diǎn)是BLACK
3骡澈、葉子節(jié)點(diǎn)(外部節(jié)點(diǎn)锅纺,空節(jié)點(diǎn))都是BLACK
4、RED節(jié)點(diǎn)的子節(jié)點(diǎn)都是BLACK
RED節(jié)點(diǎn)的parent都是BLACK肋殴,從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)的所有路徑上不能有兩個(gè)連續(xù)的RED節(jié)點(diǎn)囤锉。
5、從任一節(jié)點(diǎn)到葉子節(jié)點(diǎn)的所有路徑都包含相同數(shù)目的BLACK節(jié)點(diǎn)

2护锤、添加

已知
B樹中官地,新元素必定添加到葉子節(jié)點(diǎn)
4階B樹所有節(jié)點(diǎn)的元素個(gè)數(shù)x都符合1\leqx\leq3

2.1、添加所有情況

有4種情況滿足紅黑樹的性質(zhì)4:parent為BLACK
同樣也滿足4階B樹的性質(zhì)烙懦,因此不用做任何額外處理


無需調(diào)整

有8種情況不滿足紅黑樹的性質(zhì)4:parent為RED(DOUBLE RED)
其中前4種屬于B樹節(jié)點(diǎn)上溢的情況


需要調(diào)整
2.2驱入、LL\RR修復(fù)

判定條件 uncle不是RED
1、parent染成BLACK氯析,grand染成RED
2突照、grand進(jìn)行單旋操作


LL\RR
2.3、LR\RL修復(fù)

判定條件 uncle不是RED
1讯壶、自己染成BLACK鼠渺,grand染成RED
2、進(jìn)行雙旋操作


LR\RL
2.4你辣、上溢-LL

判定條件:uncle是RED
1巡通、parent尘执、uncle染成BLACK
2、grand向上合并
染成RED宴凉,當(dāng)做是新節(jié)點(diǎn)進(jìn)行處理
grand向上合并時(shí)誊锭,可能繼續(xù)發(fā)生上溢,若上溢持續(xù)到根節(jié)點(diǎn)弥锄,只需將根節(jié)點(diǎn)染成BLACK


上溢-LL
2.5炉旷、上溢-RR

判定條件:uncle是RED
1、parent叉讥、uncle染成BLACK
2窘行、grand向上合并
染成RED,當(dāng)做是新節(jié)點(diǎn)進(jìn)行處理


上溢-RR

以此類推图仓,下面同樣處理

2.6罐盔、上溢-LR
2.7、上溢-RL

關(guān)鍵代碼

protected void afterAdd(Node < E > node)
 {
     Node < E > parent = node.parent;
     // 添加的是根基節(jié)點(diǎn)
     if(parent == null)
     {
         black(node);
         return;
     }
     // 如果父節(jié)點(diǎn)是黑色救崔,直接返回
     if(isBlack(parent)) return;
     // uncle節(jié)點(diǎn)
     Node < E > uncle = parent.sibling();
     // 祖父節(jié)點(diǎn)
     Node < E > grand = parent.parent;
     if(isRed(uncle))
     {
         black(parent);
         black(uncle);
         // 祖父節(jié)點(diǎn)當(dāng)成是新添加的節(jié)點(diǎn)
         red(grand);
         afterAdd(grand);
         return;
     }
     // 叔父節(jié)點(diǎn)不是紅色
     if(parent.isLeftChild())
     { // L
         if(node.isLeftChild())
         { // LL
             black(parent);
             red(grand);
             rotateRight(grand);
         }
         else
         { // LR
             black(node);
             red(grand);
             rotateLeft(parent);
             rotateRight(grand);
         }
     }
     else
     {
         if(node.isLeftChild())
         { // RL
             black(node);
             red(grand);
             rotateLeft(grand);
             rotateRight(parent);
         }
         else
         { // RR
             black(parent);
             red(grand);
             rotateLeft(grand);
         }
     }
 }

3惶看、刪除

B樹中,最后真正被刪除的元素都在葉子節(jié)點(diǎn)中

3.1六孵、刪除的是RED節(jié)點(diǎn)

直接刪除纬黎,不用做調(diào)整,如下刪除劫窒,17,33,50,72


刪除RED節(jié)點(diǎn)
3.2本今、刪除的是BLACK節(jié)點(diǎn)
刪除BLACK節(jié)點(diǎn)

分3種情況
1、擁有2個(gè)RED子節(jié)點(diǎn)的BLACK節(jié)點(diǎn)
不可能被直接刪除主巍,因?yàn)闀?huì)找它的子節(jié)點(diǎn)替代刪除
因此不需要考慮這種情況
2冠息、擁有1個(gè)RED子節(jié)點(diǎn)的BLACK節(jié)點(diǎn)
條件:用以替代的子節(jié)點(diǎn)是RED
將替代的子節(jié)點(diǎn)染成BLACK即可保持紅黑樹的性質(zhì)
3、BLACK葉子節(jié)點(diǎn)-sibling為BLACK
BLACK葉子節(jié)點(diǎn)被刪除后孕索,會(huì)導(dǎo)致B樹節(jié)點(diǎn)下溢(比如下圖刪除88)
如果sibling至少有1個(gè)RED子節(jié)點(diǎn)
1)逛艰、進(jìn)行旋轉(zhuǎn),旋轉(zhuǎn)后中心節(jié)點(diǎn)繼承parent的顏色
2)搞旭、旋轉(zhuǎn)后左右節(jié)點(diǎn)染成BLACK


刪除88
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末散怖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子肄渗,更是在濱河造成了極大的恐慌镇眷,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恳啥,死亡現(xiàn)場(chǎng)離奇詭異偏灿,居然都是意外死亡丹诀,警方通過查閱死者的電腦和手機(jī)钝的,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門翁垂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人硝桩,你說我怎么就攤上這事沿猜。” “怎么了碗脊?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵啼肩,是天一觀的道長。 經(jīng)常有香客問我衙伶,道長祈坠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任矢劲,我火速辦了婚禮赦拘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芬沉。我一直安慰自己躺同,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布丸逸。 她就那樣靜靜地躺著蹋艺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪黄刚。 梳的紋絲不亂的頭發(fā)上捎谨,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音憔维,去河邊找鬼侍芝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛埋同,可吹牛的內(nèi)容都是我干的州叠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼凶赁,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼咧栗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起虱肄,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤致板,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后咏窿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斟或,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年集嵌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了萝挤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片御毅。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖怜珍,靈堂內(nèi)的尸體忽然破棺而出端蛆,到底是詐尸還是另有隱情,我是刑警寧澤酥泛,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布今豆,位于F島的核電站,受9級(jí)特大地震影響柔袁,放射性物質(zhì)發(fā)生泄漏呆躲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一捶索、第九天 我趴在偏房一處隱蔽的房頂上張望歼秽。 院中可真熱鬧,春花似錦情组、人聲如沸燥筷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肆氓。三九已至,卻和暖如春底瓣,著一層夾襖步出監(jiān)牢的瞬間谢揪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工捐凭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拨扶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓茁肠,卻偏偏與公主長得像患民,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子垦梆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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

  • 紅黑樹(Red Black Tree) 紅黑樹也是一種自平衡的二叉搜索樹匹颤,紅黑樹必須滿足一下5條性質(zhì): 1.節(jié)點(diǎn)是...
    coder_feng閱讀 291評(píng)論 0 0
  • 一、初識(shí)紅黑樹 1托猩、紅黑樹的英文是什么印蓖?紅黑樹和二叉搜索樹有什么關(guān)系? 紅黑樹(Red Black Tree):也...
    望穿秋水小作坊閱讀 211評(píng)論 0 0
  • B樹 B樹是一種平衡的多路搜索樹, 多用于文件系統(tǒng), 數(shù)據(jù)庫的實(shí)現(xiàn) 特點(diǎn) 一個(gè)節(jié)點(diǎn)可以存儲(chǔ)超過2 個(gè)元素, 可以擁...
    freemanIT閱讀 784評(píng)論 0 0
  • 紅黑樹 紅黑樹也是一種自平衡的二叉搜索樹以前也叫做平衡二叉B樹(Symmetric Binary B-tree) ...
    ducktobey閱讀 766評(píng)論 0 1
  • 一京腥、紅黑樹(Red Black Tree) 1赦肃、初識(shí)紅黑樹 紅黑樹也是一種自平衡的二叉搜索樹,也曾叫做平衡二叉B樹...
    蕭1帥閱讀 535評(píng)論 0 0