從平衡二叉樹到紅黑樹

《構(gòu)建兒童數(shù)據(jù)的二叉樹》中渗稍,本號(hào)曾經(jīng)寫過平衡二叉樹在存儲(chǔ)大量數(shù)據(jù)的應(yīng)用得湘。但是失都,平衡二叉樹雖然美觀,其插入刪除修改需要涉及的旋轉(zhuǎn)過程很耗費(fèi)時(shí)間涌乳,例如刪除結(jié)點(diǎn)時(shí)需要對(duì)結(jié)點(diǎn)到根結(jié)點(diǎn)的整個(gè)路徑進(jìn)行向上遞歸的旋轉(zhuǎn),此時(shí)需要消耗log2(n)的時(shí)間燕锥。因此對(duì)于數(shù)據(jù)量大于1000的情況,平衡二叉樹的時(shí)間劣勢(shì)會(huì)非常明顯淌友。

當(dāng)統(tǒng)計(jì)的數(shù)據(jù)的數(shù)目越來(lái)越大且需要大量更替時(shí),平衡二叉樹旋轉(zhuǎn)的時(shí)間浪費(fèi)會(huì)越來(lái)越顯著骇陈,圖一來(lái)自新禾融媒體工作室

因此震庭,人們根據(jù)平衡二叉樹旋轉(zhuǎn)消耗時(shí)間長(zhǎng)等缺點(diǎn),把它改進(jìn)為紅黑樹你雌。并對(duì)紅黑樹進(jìn)行以下定義:

1器联、每個(gè)結(jié)點(diǎn)只能是紅色和黑色的。

2婿崭、根結(jié)點(diǎn)為黑色拨拓。

3、NIL結(jié)點(diǎn)為黑色氓栈。

4渣磷、紅色結(jié)點(diǎn)的孩子都為黑色。

5授瘦、從任一結(jié)點(diǎn)到NIL葉子結(jié)點(diǎn)的所有簡(jiǎn)單路徑都經(jīng)過相同數(shù)量的黑色結(jié)點(diǎn)醋界。

與平衡二叉樹相比,紅黑樹的插入和刪除后的調(diào)整更加復(fù)雜提完,情況也更加多形纺。并且需要定義NIL結(jié)點(diǎn)為黑色的,且雙親徒欣、左右孩子都是自己的結(jié)點(diǎn)作為輔助逐样,同時(shí),規(guī)定根結(jié)點(diǎn)的雙親和葉子結(jié)點(diǎn)的左右孩子都是NIL結(jié)點(diǎn)打肝。

想象一下初夏數(shù)之不盡的蓮霧果實(shí)脂新,紅與黑被定義為淺色或深色的果實(shí)

對(duì)于紅黑樹的插入,根據(jù)定義5粗梭,新插入的結(jié)點(diǎn)必然是紅色的戏羽。在尋找到插入的位置之后,需要對(duì)插入之后的情況進(jìn)行以下調(diào)整:

當(dāng)插入的結(jié)點(diǎn)的雙親為黑色時(shí)楼吃,無(wú)需調(diào)整始花,直接插入。

當(dāng)插入的結(jié)點(diǎn)的雙親為紅色時(shí)孩锡,由于違反了定義4酷宵、5,需要通過下列6種情況以保持其性質(zhì)躬窜。這6種情況可以分為插入結(jié)點(diǎn)在左子樹和插入結(jié)點(diǎn)在右子樹的各3種情況浇垦。

以下只討論插入結(jié)點(diǎn)在左子樹的3種情況,另外3種情況為這3種情況的左右對(duì)換荣挨。

為討論方便男韧,以下定義插入結(jié)點(diǎn)為N結(jié)點(diǎn)朴摊,雙親結(jié)點(diǎn)為P結(jié)點(diǎn),雙親的雙親(祖親)為G結(jié)點(diǎn)此虑,祖親在雙親之外的孩子結(jié)點(diǎn)(旁親)為U結(jié)點(diǎn)甚纲。

情況1:結(jié)點(diǎn)的旁親為紅色。此時(shí)只需要把雙親和旁親變黑色朦前,祖親變紅色介杆,并迭代調(diào)整插入結(jié)點(diǎn)的祖親結(jié)點(diǎn)直到根結(jié)點(diǎn)。

情況2:結(jié)點(diǎn)的旁親為黑色韭寸,且插入結(jié)點(diǎn)為雙親的右孩子春哨。此時(shí)需要對(duì)雙親進(jìn)行左旋(關(guān)于左旋、右旋詳見《構(gòu)建兒童數(shù)據(jù)的二叉樹》恩伺,不再贅述)赴背,至此進(jìn)入情況3。

情況3:結(jié)點(diǎn)的旁親為黑色晶渠,且插入結(jié)點(diǎn)為雙親的左孩子凰荚。此時(shí)需要把雙親結(jié)點(diǎn)變?yōu)楹谏嬗H結(jié)點(diǎn)變?yōu)榧t色乱陡,并對(duì)祖親結(jié)點(diǎn)進(jìn)行右旋。

對(duì)于紅黑樹的刪除仪壮,和平衡二叉樹的刪除基本一樣憨颠。當(dāng)刪除的是葉子結(jié)點(diǎn)時(shí),葉子結(jié)點(diǎn)用NIL結(jié)點(diǎn)頂替积锅,當(dāng)刪除的是只有一個(gè)孩子的結(jié)點(diǎn)時(shí)爽彤,用其孩子頂替,當(dāng)刪除的結(jié)點(diǎn)有兩個(gè)孩子時(shí)缚陷,用右子樹的最左邊結(jié)點(diǎn)(或左子樹的最右邊結(jié)點(diǎn))頂替适篙。刪除根結(jié)點(diǎn)時(shí),用NIL結(jié)點(diǎn)頂替根結(jié)點(diǎn)自身箫爷。

不同在于嚷节,刪除的過程中需對(duì)被刪除的結(jié)點(diǎn)進(jìn)行判斷并調(diào)整。

當(dāng)被刪除的結(jié)點(diǎn)為紅色時(shí)虎锚,無(wú)需調(diào)整硫痰,直接刪除。

當(dāng)被刪除的結(jié)點(diǎn)為黑色時(shí)窜护,由于違反了定義5效斑,需要通過下列8種情況以保持其性質(zhì)。這8種情況可以分為被刪除的是左孩子還是右孩子的各4種情況柱徙。

和插入一樣缓屠,以下只討論被刪除的是左孩子的4種情況奇昙,另外4種情況為這4種情況的左右對(duì)換。

為討論方便敌完,以下定義被刪除結(jié)點(diǎn)為D結(jié)點(diǎn)储耐,被刪除結(jié)點(diǎn)的同胞結(jié)點(diǎn)為S結(jié)點(diǎn),同胞結(jié)點(diǎn)的左孩子(左侄親)為L(zhǎng)結(jié)點(diǎn)蠢挡,同胞結(jié)點(diǎn)的右孩子(右侄親)為R結(jié)點(diǎn)弧岳。

另外,下列圖中結(jié)點(diǎn)如果為黑圈套紅圈(或紅圈套黑圈)的业踏,說明結(jié)點(diǎn)可為紅色或黑色禽炬,其內(nèi)圈和外圈的顏色變化為結(jié)點(diǎn)顏色不同基礎(chǔ)下顏色的變化。

情況1:結(jié)點(diǎn)的同胞為紅色勤家。此時(shí)需要把同胞結(jié)點(diǎn)變黑色腹尖,雙親結(jié)點(diǎn)變紅色,并對(duì)雙親結(jié)點(diǎn)左旋伐脖。

情況2:結(jié)點(diǎn)的同胞為黑色热幔,且兩個(gè)侄親結(jié)點(diǎn)均為黑色。此時(shí)把同胞結(jié)點(diǎn)變紅色讼庇,然后迭代向雙親方向調(diào)整绎巨。

情況3:結(jié)點(diǎn)的同胞為黑色,右侄親為黑色且左侄親為紅色蠕啄。此時(shí)把同胞變紅色场勤,左侄親變黑色并對(duì)同胞結(jié)點(diǎn)右旋。至此進(jìn)入情況4歼跟。

情況4:結(jié)點(diǎn)的同胞為黑色和媳,右侄親為紅色。此時(shí)先把雙親的顏色作為同胞的顏色哈街,之后把雙親變黑色留瞳,右侄親變黑色,之后對(duì)雙親結(jié)點(diǎn)進(jìn)行左旋骚秦,最后把結(jié)點(diǎn)返回到根結(jié)點(diǎn)她倘。

當(dāng)被刪除的對(duì)應(yīng)結(jié)點(diǎn)不是根結(jié)點(diǎn)且結(jié)點(diǎn)為黑色時(shí),循環(huán)上述操作在刪除的最后作箍,需要設(shè)置根結(jié)點(diǎn)總為黑色帝牡。

由于平衡二叉樹最大高度為

,小于紅黑樹的最大高度

蒙揣,所以在最壞的情況下靶溜,平衡二叉樹在遍歷或搜索的時(shí)間會(huì)略小于紅黑樹。但兩者的差別不大,當(dāng)數(shù)據(jù)足夠多時(shí)罩息,平衡二叉樹和紅黑樹的樹高都會(huì)趨向于理想狀態(tài)嗤详,即

平衡二叉樹的美觀性瓷炮,體現(xiàn)在層次的均勻上葱色,但這種均勻是要付出旋轉(zhuǎn)的代價(jià)的

而由于紅黑樹在刪除時(shí)最多只需要3次旋轉(zhuǎn)即可保持其性質(zhì),但平衡二叉樹最多需要log2(n)次娘香,因此在大量插入刪除苍狰,體現(xiàn)在需要大量更替數(shù)據(jù)的情況下,紅黑樹的優(yōu)勢(shì)將更加顯現(xiàn)出來(lái)烘绽,并抵消不完美平衡的不足淋昭。

紅黑樹在結(jié)構(gòu)上像梅樹、橘子樹和榕樹安接,不完全平衡翔忽,但插入刪除修改的時(shí)間更少

在現(xiàn)實(shí)當(dāng)中,紅黑樹在計(jì)算機(jī)科學(xué)領(lǐng)域的應(yīng)用很廣盏檐。例如Java中的TreeSet歇式,TreeMap就是紅黑樹的應(yīng)用,并且紅黑樹log2(n)的時(shí)間復(fù)雜度使得它在數(shù)據(jù)量很大時(shí)胡野,可以充當(dāng)鏈表的作用材失。

對(duì)于現(xiàn)實(shí)世界中像一個(gè)區(qū)域內(nèi)所有的兒童的數(shù)據(jù),一個(gè)網(wǎng)頁(yè)的站內(nèi)搜索功能等查找功能相對(duì)更多的情況硫豆,平衡二叉樹可有利于提高運(yùn)行的效率龙巨。而像一個(gè)景點(diǎn)內(nèi)部的人的信息存儲(chǔ),大量用戶爭(zhēng)奪一個(gè)直播的貸款等需要大量數(shù)據(jù)插入刪除的的情況够庙,紅黑樹的效率會(huì)更高恭应。

這兩種應(yīng)用類似圖書館的文獻(xiàn)資料管理或旅游點(diǎn)的進(jìn)出流量

但隨著數(shù)據(jù)量的增長(zhǎng)抄邀,紅黑樹的優(yōu)勢(shì)會(huì)漸漸顯著耘眨,這也是紅黑樹比平衡二叉樹應(yīng)用更廣的原因。

參考資料

https://blog.csdn.net/l_o_s/article/details/105703296

https://blog.csdn.net/v_JULY_v/article/details/6124989

https://blog.csdn.net/v_JULY_v/article/details/6109153

https://blog.csdn.net/v_JULY_v/article/details/6285620

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末境肾,一起剝皮案震驚了整個(gè)濱河市剔难,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奥喻,老刑警劉巖偶宫,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異环鲤,居然都是意外死亡纯趋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吵冒,“玉大人纯命,你說我怎么就攤上這事”云埽” “怎么了亿汞?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)揪阿。 經(jīng)常有香客問我疗我,道長(zhǎng),這世上最難降的妖魔是什么南捂? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任吴裤,我火速辦了婚禮,結(jié)果婚禮上黑毅,老公的妹妹穿的比我還像新娘嚼摩。我一直安慰自己,他們只是感情好矿瘦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布枕面。 她就那樣靜靜地躺著,像睡著了一般缚去。 火紅的嫁衣襯著肌膚如雪潮秘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天易结,我揣著相機(jī)與錄音枕荞,去河邊找鬼。 笑死搞动,一個(gè)胖子當(dāng)著我的面吹牛躏精,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鹦肿,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼矗烛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了箩溃?” 一聲冷哼從身側(cè)響起瞭吃,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涣旨,沒想到半個(gè)月后歪架,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡霹陡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年和蚪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了止状。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡攒霹,死狀恐怖导俘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情剔蹋,我是刑警寧澤旅薄,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站泣崩,受9級(jí)特大地震影響少梁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矫付,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一凯沪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧买优,春花似錦妨马、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至脂崔,卻和暖如春滤淳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背砌左。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工脖咐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人汇歹。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓屁擅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親产弹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子派歌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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