(圖文結(jié)合)詳細(xì)描述紅黑樹如何左旋严沥、右旋

紅黑樹

首先要理解二叉查找樹

二叉查找樹(BST)具備什么特性呢鲁冯?

  1. 左子樹上所有結(jié)點(diǎn)的值均小于或等于它的根結(jié)點(diǎn)的值。

  2. 右子樹上所有結(jié)點(diǎn)的值均大于或等于它的根結(jié)點(diǎn)的值色查。

  3. 左薯演、右子樹也分別為二叉排序樹。

  • 二叉查找樹是二分查找的思想秧了,查找所需的最大次數(shù)等同于二叉樹的高度跨扮。
  • 在插入節(jié)點(diǎn)的時(shí)候也是利用類似的方法,一層一層比較大小验毡,找到合適的插入位置衡创。
  • 如右圖,這樣雖然滿足了二叉查找樹的條件晶通,但是這個(gè)是瘸腿的二叉查找樹璃氢,就和鏈表沒有區(qū)別了。這是二叉查找樹的缺點(diǎn)
  • 解決二叉查找樹多次插入新節(jié)點(diǎn)而導(dǎo)致的不平衡的方法狮辽,就是使用紅黑樹一也。
  • 紅黑樹是一種自平衡的二叉查找樹。除了符合二叉查找樹的基本特性外喉脖,還具有下列的附加特性:
    1. 節(jié)點(diǎn)是紅色或黑色椰苟。
    2. 根節(jié)點(diǎn)是黑色
    3. 每個(gè)葉子節(jié)點(diǎn)都是黑色的空節(jié)點(diǎn)(NIL節(jié)點(diǎn))树叽。
    4. 每個(gè)紅色節(jié)點(diǎn)的兩個(gè)子節(jié)點(diǎn)都是黑色舆蝴。(從每個(gè)葉子到根的所有路徑上不能有兩個(gè)連續(xù)的紅色節(jié)點(diǎn))
    5. 從任一節(jié)點(diǎn)到其每個(gè)葉子的所有路徑都包含相同數(shù)目的黑色節(jié)點(diǎn)。
  • 上面一系列的規(guī)則,保證了紅黑樹的自平衡洁仗。紅黑樹從根到葉子的最長(zhǎng)路徑不會(huì)超過最短路徑的2倍
  • 當(dāng)插入或刪除節(jié)點(diǎn)的時(shí)候层皱,紅黑樹的規(guī)則有可能被打破,這個(gè)時(shí)候需要進(jìn)行調(diào)整來維持紅黑樹的規(guī)則京痢。

如下圖奶甘,如果向原紅黑樹插入值為21的新節(jié)點(diǎn),由于父節(jié)點(diǎn)22是紅色節(jié)點(diǎn)祭椰,因此這種情況打破了紅黑樹的規(guī)則4(每個(gè)紅色節(jié)點(diǎn)的兩個(gè)子節(jié)點(diǎn)都是黑色)臭家,必須進(jìn)行調(diào)整,使之重新符合紅黑樹的規(guī)則方淤。

  • 調(diào)整的方法有兩種:
    1. 變色:紅變黑钉赁,黑變紅
    2. 旋轉(zhuǎn):左旋轉(zhuǎn)和右旋轉(zhuǎn)

變換規(guī)則

  • 旋轉(zhuǎn)和顏色變換規(guī)則:所有插入的點(diǎn)默認(rèn)為紅色
  1. 變顏色的情況:當(dāng)前結(jié)點(diǎn)的父親是紅色,且它的祖父結(jié)點(diǎn)的另一個(gè)子結(jié)點(diǎn)也是紅色(叔叔結(jié)點(diǎn)):

    (1)把父節(jié)點(diǎn)設(shè)為黑色

    (2)把叔叔也設(shè)為黑色

    (3)把祖父也就是父親的父親設(shè)為紅色(爺爺)

    (4)把指針定義到祖父結(jié)點(diǎn)設(shè)為當(dāng)前要操作的(爺爺)分析的點(diǎn)變換的規(guī)則

  2. 旋:當(dāng)前父結(jié)點(diǎn)是紅色携茂,叔叔是黑色的時(shí)候你踩,且當(dāng)前的結(jié)點(diǎn)是子樹。左旋以父節(jié)點(diǎn)作為左旋

  3. 旋:當(dāng)前父結(jié)點(diǎn)是紅色讳苦,叔叔是黑色的時(shí)候带膜,且當(dāng)前的結(jié)點(diǎn)是子樹。右旋

    (1)把父節(jié)點(diǎn)變?yōu)楹谏?/strong>

    (2)把祖父結(jié)點(diǎn)變?yōu)榧t色(爺爺)

    (3)把祖父結(jié)點(diǎn)旋轉(zhuǎn)(爺爺)

變色

為了重新符合紅黑樹的規(guī)則鸳谜,嘗試把紅色節(jié)點(diǎn)變?yōu)楹谏ヅ海蛘甙押谏?jié)點(diǎn)變?yōu)榧t色。

  • 下圖所表示的是紅黑樹的一部分咐扭,需要注意節(jié)點(diǎn)25并非根節(jié)點(diǎn)芭挽。因?yàn)楣?jié)點(diǎn)21和節(jié)點(diǎn)22連續(xù)出現(xiàn)了紅色,不符合規(guī)則4蝗肪,所以把節(jié)點(diǎn)22從紅色變成黑色:

  • 但這樣并不算完袜爪,因?yàn)閼{空多出的黑色節(jié)點(diǎn)打破了規(guī)則5,所以發(fā)生連鎖反應(yīng)薛闪,需要繼續(xù)把節(jié)點(diǎn)25從黑色變成紅色:

  • 此時(shí)仍然沒有結(jié)束辛馆,因?yàn)楣?jié)點(diǎn)25和節(jié)點(diǎn)27又形成了兩個(gè)連續(xù)的紅色節(jié)點(diǎn),需要繼續(xù)把節(jié)點(diǎn)27從紅色變成黑色:

左旋轉(zhuǎn)

  • 左旋轉(zhuǎn)豁延,就是將S點(diǎn)旋轉(zhuǎn)到根節(jié)點(diǎn)怀各,S節(jié)點(diǎn)的左邊都掛到E節(jié)點(diǎn)的右邊
  • 就是將要旋轉(zhuǎn)的子結(jié)點(diǎn)的左邊掛到之前節(jié)點(diǎn)E的右邊

右旋轉(zhuǎn)

將要旋轉(zhuǎn)的子結(jié)點(diǎn)的右邊移到之前結(jié)點(diǎn)E的左邊

舉例說明

  1. 首先我們要插入結(jié)點(diǎn)6,按照二叉查找樹放在如下位置术浪。
  1. 我們發(fā)現(xiàn)結(jié)點(diǎn)6和結(jié)點(diǎn)7是紅色的瓢对,不滿足規(guī)則,下一步要判斷是變色還是旋轉(zhuǎn)

    當(dāng)前結(jié)點(diǎn)的父親是紅色胰苏,且它的祖父結(jié)點(diǎn)的另一個(gè)子結(jié)點(diǎn)也是紅色硕蛹,我們要進(jìn)行的是變色。把父節(jié)點(diǎn)和叔叔設(shè)為黑色,把祖父也就是父親的父親設(shè)為紅色(爺爺)

  2. 我們發(fā)現(xiàn)結(jié)點(diǎn)5和結(jié)點(diǎn)12還是不滿足規(guī)則法焰。變色是說父親結(jié)點(diǎn)和叔叔結(jié)點(diǎn)都是紅色秧荆。不滿足,我們用旋轉(zhuǎn)埃仪。結(jié)點(diǎn)12位于結(jié)點(diǎn)5的右子樹上乙濒。用左旋。

    [圖片上傳失敗...(image-b433f8-1585661664741)]

  3. 對(duì)結(jié)點(diǎn)5還要進(jìn)行右旋卵蛉。

    (1)把父節(jié)點(diǎn)變?yōu)楹谏?/p>

    (2)把祖父結(jié)點(diǎn)變?yōu)榧t色(爺爺)

    (3)以爺爺結(jié)點(diǎn)旋轉(zhuǎn)

  4. 以上颁股。上面的紅黑樹就沒有問題了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末实柠,一起剝皮案震驚了整個(gè)濱河市黔姜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌管怠,老刑警劉巖葡缰,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亏掀,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡泛释,警方通過查閱死者的電腦和手機(jī)滤愕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怜校,“玉大人间影,你說我怎么就攤上這事【禄” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵蔓搞,是天一觀的道長(zhǎng)胰丁。 經(jīng)常有香客問我,道長(zhǎng)喂分,這世上最難降的妖魔是什么锦庸? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮蒲祈,結(jié)果婚禮上甘萧,老公的妹妹穿的比我還像新娘。我一直安慰自己梆掸,他們只是感情好扬卷,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著酸钦,像睡著了一般怪得。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天徒恋,我揣著相機(jī)與錄音蚕断,去河邊找鬼。 笑死入挣,一個(gè)胖子當(dāng)著我的面吹牛亿乳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播径筏,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼葛假,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了匠璧?” 一聲冷哼從身側(cè)響起桐款,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夷恍,沒想到半個(gè)月后魔眨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酿雪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年遏暴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片指黎。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡朋凉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出醋安,到底是詐尸還是另有隱情杂彭,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布吓揪,位于F島的核電站亲怠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏柠辞。R本人自食惡果不足惜团秽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望叭首。 院中可真熱鬧习勤,春花似錦、人聲如沸焙格。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眷唉。三九已至吴旋,卻和暖如春损肛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背荣瑟。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工治拿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人笆焰。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓劫谅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嚷掠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捏检,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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