數(shù)據(jù)結(jié)構(gòu)與算法11--紅黑樹

紅黑樹

  • 紅黑樹也是一種自平衡的二叉搜索樹贾虽;
  • 紅黑樹以前也叫做平衡二叉B樹;

如下圖所示:

Snip20210511_15.png

紅黑樹的5條性質(zhì):

  1. 節(jié)點(diǎn)是RED或者BLACK叙凡;
  2. 根節(jié)點(diǎn)是BLACK正驻;
  3. 葉子節(jié)點(diǎn)(空節(jié)點(diǎn))都是BLACK;
  4. RED節(jié)點(diǎn)的子節(jié)點(diǎn)都是BLACK牵辣;
    4.1 RED節(jié)點(diǎn)的parent都是BLACK摔癣;
    4.2 從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)的所有路徑上不能有2個(gè)連續(xù)的RED節(jié)點(diǎn);
  5. 從任意節(jié)點(diǎn)到葉子節(jié)點(diǎn)的所有路徑都包含相同數(shù)目的BLACK節(jié)點(diǎn)纬向;

B樹

  • B樹是一種平衡的多路搜索樹择浊,多用于文件系統(tǒng),數(shù)據(jù)庫(kù)的實(shí)現(xiàn)逾条;
  • 一個(gè)節(jié)點(diǎn)可以存儲(chǔ)超過2個(gè)元素近她,可以擁有超過2個(gè)字節(jié)點(diǎn);
  • 擁有二叉搜索樹的性質(zhì)膳帕;
  • 平衡粘捎,每個(gè)節(jié)點(diǎn)的所有子樹高度一致;
  • 比較矮危彩;

m階B樹的性質(zhì)(m>=2)

  • m階B樹是指一個(gè)節(jié)點(diǎn)最多擁有m個(gè)子節(jié)點(diǎn)攒磨;
Snip20210511_16.png
Snip20210511_17.png
  • 假設(shè)一個(gè)節(jié)點(diǎn)存儲(chǔ)的元素個(gè)數(shù)為x
    • 根節(jié)點(diǎn): 1 <= x <= m - 1
    • 非根節(jié)點(diǎn): ceil(m/2) - 1 <= x <= m -1
  • 如果有子節(jié)點(diǎn),子節(jié)點(diǎn)的個(gè)數(shù) y = x + 1汤徽;
    • 根節(jié)點(diǎn)的子節(jié)點(diǎn):2 <= y <= m
    • 非根節(jié)點(diǎn)的子節(jié)點(diǎn): ceil(m/2) <= y <= m

以m=3娩缰,即3階B樹為例:

  • 根節(jié)點(diǎn)的元素個(gè)數(shù) 1<= x <= 2,即1或者2谒府,不會(huì)有3個(gè)元素拼坎;

  • 非根節(jié)點(diǎn)的元素個(gè)數(shù) 1<= x <= 2浮毯,即1或者2,不會(huì)有3個(gè)元素泰鸡;

  • 根節(jié)點(diǎn)的子節(jié)點(diǎn)個(gè)數(shù) 2 <= y <= 3

  • 非根節(jié)點(diǎn)的子節(jié)點(diǎn)個(gè)數(shù) 2 <= y <= 3

  • B樹與二叉搜索樹债蓝,在邏輯上等價(jià)的;

  • 多代節(jié)點(diǎn)合并盛龄,可以獲得一個(gè)超級(jí)節(jié)點(diǎn)饰迹;

  • 2代合并的超級(jí)節(jié)點(diǎn),最多擁有4個(gè)子節(jié)點(diǎn)余舶,至少是4階B樹啊鸭;

  • 3代合并的超級(jí)節(jié)點(diǎn),最多擁有8個(gè)子節(jié)點(diǎn)匿值,至少是8階B樹赠制;

  • n代合并的超級(jí)節(jié)點(diǎn),最多擁有 2^n 個(gè)子節(jié)點(diǎn)挟憔,至少是 2^n 階B樹钟些;

  • m階B樹,最多需要log2 m帶合并曲楚;

搜索指定節(jié)點(diǎn)

  • 從根節(jié)點(diǎn)開始厘唾;
  • 先在節(jié)點(diǎn)內(nèi)部從小到大開始搜索元素;
  • 如果命中龙誊,搜索結(jié)束抚垃;
  • 如果未命中,再去對(duì)應(yīng)的子節(jié)點(diǎn)中搜索元素鹤树,重復(fù)步驟1;

添加

  • 新添加的元素必定是添加到葉子節(jié)點(diǎn)逊朽;

添加導(dǎo)致上溢

  • 上溢節(jié)點(diǎn)的元素個(gè)數(shù)必然等于m罕伯;
  • 假設(shè)上溢節(jié)點(diǎn)最中間的元素的位置為k追他;
  • 將k位置的元素向上與父節(jié)點(diǎn)合并邑狸;
  • 將[0,k-1]和[k+1硅堆,m-1]位置的元素分裂成2個(gè)子節(jié)點(diǎn),這兩個(gè)子節(jié)點(diǎn)的元素個(gè)數(shù)助赞,必然都不會(huì)低于最低限制ceil(m/2)-1群叶;
  • 一次分裂完成后舶衬,有可能導(dǎo)致父節(jié)點(diǎn)上溢虽画,依然按照上述的方法解決;
  • 最極端的情況,有可能一直分裂到根節(jié)點(diǎn);

如下所示:4階B樹,添加元素98

Snip20210511_18.png
Snip20210511_19.png
  • 添加元素98,由于是4階B樹涡扼,節(jié)點(diǎn)元素個(gè)數(shù)最大為3红淡,則導(dǎo)致上溢在旱;需進(jìn)行一次分裂結(jié)果如下:
Snip20210511_20.png

刪除葉子節(jié)點(diǎn)

  • 需要?jiǎng)h除的元素在葉子節(jié)點(diǎn)中,那么直接刪除即可;

如下所示:刪除元素55


Snip20210511_18.png
  • 刪除元素55之后:
Snip20210511_21.png

刪除非葉子節(jié)點(diǎn)

  • 先找到其前驅(qū)或者后繼元素被饿,覆蓋所需刪除元素的值哎垦;
  • 再把前驅(qū)或后繼元素刪除蛙奖;

如下所示:刪除元素60

Snip20210511_22.png
Snip20210511_23.png
  • 真正被刪除的元素是前繼元素55昂拂,
  • 真正被刪除的元素都是在葉子節(jié)點(diǎn)中。

刪除導(dǎo)致下溢

原理如下所示:

Snip20210517_2.png

看一個(gè)例子:5階B樹刪除元素22

Snip20210511_24.png
  • 刪除元素22,由上面的結(jié)論我們知道非根節(jié)點(diǎn)的元素?cái)?shù)量 ceil(5/2)-1<= x <= 4恐似,即至少有兩個(gè)元素,現(xiàn)在刪除22嘶摊,導(dǎo)致當(dāng)前節(jié)點(diǎn)的元素為1蔗喂,即導(dǎo)致下溢;
  • 下溢節(jié)點(diǎn)的元素?cái)?shù)量必然等于ceil(m/2) - 2
  • 如果下溢節(jié)點(diǎn)臨近的兄弟節(jié)點(diǎn)至少有ceil(m/2)個(gè)元素椅棺,可以向其借一個(gè)元素;
  • 將父節(jié)點(diǎn)的元素b插入到下溢節(jié)點(diǎn)的最小位置缎脾;
  • 用兄弟節(jié)點(diǎn)的元素a(最大元素)替代父節(jié)點(diǎn)的元素b友多;
  • 上述操作的本質(zhì)就是:旋轉(zhuǎn)蜈抓,操作結(jié)果如下所示:
Snip20210517_1.png
  • 如果下溢節(jié)點(diǎn)的臨近兄弟節(jié)點(diǎn),只有ceil(m/2)-1個(gè)元素;
  • 將父節(jié)點(diǎn)的元素b挪下來(lái)與左右子節(jié)點(diǎn)進(jìn)行合并睁枕;
  • 合并之后的節(jié)點(diǎn)元素個(gè)數(shù)為ceil(m/2)+ceil(m/2)-2,不會(huì)超過m-1泣棋;原理如下圖所示:
Snip20210517_3.png
  • 此操作可能會(huì)導(dǎo)致父節(jié)點(diǎn)下溢寄摆,依然按照上述的方法解決,下溢現(xiàn)象可能會(huì)一直向上傳播椎椰;

紅黑樹的等價(jià)變換

  • 紅黑樹與4階B樹具有等價(jià)性塔猾;
  • BLACK節(jié)點(diǎn)與它的RED子節(jié)點(diǎn)融合在一起睦擂,形成一個(gè)B樹節(jié)點(diǎn)摆马;
  • 紅黑樹的BLACK節(jié)點(diǎn)個(gè)數(shù)與4階B樹的節(jié)點(diǎn)總個(gè)數(shù)相等斑唬;
Snip20210519_17.png

紅黑樹的添加

  • 新元素的必定是添加到葉子節(jié)點(diǎn)中蓄喇;
  • 4階B樹所有節(jié)點(diǎn)的元素個(gè)數(shù)x都滿足 【1,3】肮蛹;
  • 建議新添加的節(jié)點(diǎn)默認(rèn)為紅色RED;
  • 如果添加的是根節(jié)點(diǎn),染成黑色BLACK即可蜂绎;

以上面的紅黑樹為例子栅表,進(jìn)行闡述添加的所有情況:

  1. 當(dāng)添加的節(jié)點(diǎn)的父節(jié)點(diǎn)parent為黑色BLACK,如下圖所示:
Snip20210519_18.png
  • 具體有4種情況师枣,見圖中被添加的粉色節(jié)點(diǎn)怪瓶;
  • 能同時(shí)滿足紅黑樹的五條性質(zhì),因此不用做任何額外的處理践美;
  1. 當(dāng)添加的節(jié)點(diǎn)的父節(jié)點(diǎn)parent為紅色RED洗贰,如下圖所示:
Snip20210519_19.png
  • 具體有8種情況,見圖中被添加的粉色節(jié)點(diǎn)陨倡;
  • 不滿足紅黑樹的第4條性質(zhì):RED節(jié)點(diǎn)的子節(jié)點(diǎn)都是BLACK敛滋;
添加 - 修復(fù)性質(zhì)4 -- LL/RR
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市兴革,隨后出現(xiàn)的幾起案子绎晃,更是在濱河造成了極大的恐慌,老刑警劉巖杂曲,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庶艾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡擎勘,警方通過查閱死者的電腦和手機(jī)咱揍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)棚饵,“玉大人煤裙,你說(shuō)我怎么就攤上這事≡胙” “怎么了积暖?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)怪与。 經(jīng)常有香客問我,道長(zhǎng)缅疟,這世上最難降的妖魔是什么分别? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任遍愿,我火速辦了婚禮,結(jié)果婚禮上耘斩,老公的妹妹穿的比我還像新娘沼填。我一直安慰自己,他們只是感情好括授,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布坞笙。 她就那樣靜靜地躺著,像睡著了一般荚虚。 火紅的嫁衣襯著肌膚如雪薛夜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天版述,我揣著相機(jī)與錄音梯澜,去河邊找鬼。 笑死渴析,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播陌宿,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼涧黄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了母债?” 一聲冷哼從身側(cè)響起午磁,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎场斑,沒想到半個(gè)月后漓踢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漏隐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年喧半,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片青责。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挺据,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脖隶,到底是詐尸還是另有隱情扁耐,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布产阱,位于F島的核電站婉称,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜王暗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一悔据、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧俗壹,春花似錦科汗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至涎显,卻和暖如春坤检,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背棺禾。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工缀蹄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人膘婶。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓缺前,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親悬襟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子衅码,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

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