<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          漫畫:什么是紅黑樹?

          共 1800字,需瀏覽 4分鐘

           ·

          2019-12-07 23:25


          本文公眾號(hào)來源:程序員小灰作者:玻璃貓本文已收錄至我的GitHub


          1437a3c00c5eb7e08ee8fcadc7f031dd.webp



          c1f4810ffd46081d8e145967c33e7099.webp



          17d3b3cdc6d0b37fc0980e403ea5090c.webp



          42da9b04101498a9f24896454acd46cd.webp



          ————————————



          3b2634144430592ba6094599b0c9a1bc.webp



          ef7b61e86776ebc2d2488ef545e20509.webp



          f24524c71e8f59d850b7890854af183b.webp



          a09d0b24e5c57519640faf9702d9476b.webp



          6b0256562e3e360c7e92c9de485d7dd4.webp



          e4f1aeb7b88eaf29f8c5f63e23fd80ac.webp



          f8197e1cc9c414fde0398eeed737f052.webp



          1cb7735d36e51dd93722e833e9b34fbb.webp



          ————————————



          e4d0fd1a16864f018528a23a494d9501.webp



          3a751dda38cef23e4fb0087ad465684e.webp



          53b9427739a73adf83d06378607c78f3.webp



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


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

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

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


          下圖中這棵樹,就是一顆典型的二叉查找樹:



          cf304a7ee97347c1e80b28080d4bc6d6.webp



          73ba4e166b688f7e90debe3064ef4cba.webp



          1.查看根節(jié)點(diǎn)9


          fa7b8fb25c0b401bd36c44ff85e8b792.webp



          2.由于10 > 9,因此查看右孩子13


          720732a09b7064e805f44d0ead0625de.webp



          3.由于10 < 13,因此查看左孩子11


          a199bb774081fe0cb0a116739fc0daa8.webp



          4.由于10 < 11,因此查看左孩子10,發(fā)現(xiàn)10正是要查找的節(jié)點(diǎn):


          86834b8e4d8bf10fc1d5cdb0a4a475d3.webp



          4e9de636e6fd5b84d714937902bd3014.webp



          d39a66951bbeeaf131100d9e8d4878ec.webp



          437bd3c90ff49fbf15478da1d732c6f4.webp



          eb795faac7e75f3803139757314dacd2.webp



          172a502bbd285d7d727e6dbe5c5e1349.webp



          84fbdd166d5cabcdb47d9cbc4bec1c04.webp



          假設(shè)初始的二叉查找樹只有三個(gè)節(jié)點(diǎn),根節(jié)點(diǎn)值為9,左孩子值為8,右孩子值為12:


          d6e6a2047f293b51a5fc6d92429c04d9.webp



          接下來我們依次插入如下五個(gè)節(jié)點(diǎn):7,6,5,4,3。依照二叉查找樹的特性,結(jié)果會(huì)變成什么樣呢?


          48decc6a8a4530873a39242c0bed5052.webp



          3ac1a417530b68777858f10370f3c8ba.webp



          e0c92c9e43e67809cee96fa13b109d2e.webp



          2c61ec7772a0903381dd4637f49de211.webp



          09292e4a916f6b09edb40fda144ed272.webp



          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)。


          下圖中這棵樹,就是一顆典型的紅黑樹:


          a57789c43eeac5466141592ab77f7206.webp



          6db0e31b354fc026899bcef6aeb0e073.webp



          e112f44f367934e0382e8a4034fb8076.webp



          090cbf117613ca4f6c3a58a722b48fe5.webp



          什么情況下會(huì)破壞紅黑樹的規(guī)則,什么情況下不會(huì)破壞規(guī)則呢?我們舉兩個(gè)簡(jiǎn)單的栗子:


          1.向原紅黑樹插入值為14的新節(jié)點(diǎn):


          6ca0c84ec971495cd9023ce0d7022468.webp



          由于父節(jié)點(diǎn)15是黑色節(jié)點(diǎn),因此這種情況并不會(huì)破壞紅黑樹的規(guī)則,無需做任何調(diào)整。



          2.向原紅黑樹插入值為21的新節(jié)點(diǎn):


          db756da30b2ed6ab5741b8989f58ce9b.webp



          由于父節(jié)點(diǎn)22是紅色節(jié)點(diǎn),因此這種情況打破了紅黑樹的規(guī)則4(每個(gè)紅色節(jié)點(diǎn)的兩個(gè)子節(jié)點(diǎn)都是黑色),必須進(jìn)行調(diào)整,使之重新符合紅黑樹的規(guī)則。



          392e16e6e4085555edcf02b77c6da5a2.webp



          d6672f60f4ba3b891e58bd71375eb586.webp



          變色:


          為了重新符合紅黑樹的規(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從紅色變成黑色:


          f5a7ed7ab25aa5ad0a2c7d43bc4d7160.webp



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


          df48372ebcdaad59c772cfdeb8e0a978.webp



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


          cc5806043e2bd626e622a7a49ff873c1.webp



          左旋轉(zhuǎn):


          逆時(shí)針旋轉(zhuǎn)紅黑樹的兩個(gè)節(jié)點(diǎn),使得父節(jié)點(diǎn)被自己的右孩子取代,而自己成為自己的左孩子。說起來很怪異,大家看下圖:


          5854516899ef0b4c2a05741607c8ef84.webp


          圖中,身為右孩子的Y取代了X的位置,而X變成了自己的左孩子。此為左旋轉(zhuǎn)。



          右旋轉(zhuǎn):


          順時(shí)針旋轉(zhuǎn)紅黑樹的兩個(gè)節(jié)點(diǎn),使得父節(jié)點(diǎn)被自己的左孩子取代,而自己成為自己的右孩子。大家看下圖:


          0d849c369bc34f0bf549d3e3fad558e6.webp


          圖中,身為左孩子的Y取代了X的位置,而X變成了自己的右孩子。此為右旋轉(zhuǎn)。



          ce5dadabcc9c38a9baba9fa5e9158dfe.webp



          f4b050ead9f6f6471670d85b2bf655ed.webp



          我們以剛才插入節(jié)點(diǎn)21的情況為例:


          db756da30b2ed6ab5741b8989f58ce9b.webp



          首先,我們需要做的是變色,把節(jié)點(diǎn)25及其下方的節(jié)點(diǎn)變色:


          cf1c148ca942c5366d3f787e50a6789c.webp



          此時(shí)節(jié)點(diǎn)17和節(jié)點(diǎn)25是連續(xù)的兩個(gè)紅色節(jié)點(diǎn),那么把節(jié)點(diǎn)17變成黑色節(jié)點(diǎn)?恐怕不合適。這樣一來不但打破了規(guī)則4,而且根據(jù)規(guī)則2(根節(jié)點(diǎn)是黑色),也不可能把節(jié)點(diǎn)13變成紅色節(jié)點(diǎn)。


          變色已無法解決問題,我們把節(jié)點(diǎn)13看做X,把節(jié)點(diǎn)17看做Y,像剛才的示意圖那樣進(jìn)行左旋轉(zhuǎn)


          5854516899ef0b4c2a05741607c8ef84.webp



          b8e111e2223990ca5d32923288f303c0.webp



          6967a44c6a841e9b90860c9266197111.webp



          由于根節(jié)點(diǎn)必須是黑色節(jié)點(diǎn),所以需要變色,變色結(jié)果如下:


          cf9db20456d635116d758ac615cda798.webp



          這樣就結(jié)束了嗎?并沒有。因?yàn)槠渲袃蓷l路徑(17 -> 8 -> 6 -> NIL)的黑色節(jié)點(diǎn)個(gè)數(shù)是4,其他路徑的黑色節(jié)點(diǎn)個(gè)數(shù)是3,不符合規(guī)則5。


          這時(shí)候我們需要把節(jié)點(diǎn)13看做X,節(jié)點(diǎn)8看做Y,像剛才的示意圖那樣進(jìn)行右旋轉(zhuǎn)


          0d849c369bc34f0bf549d3e3fad558e6.webp



          7ccbd5e039176fbab0a57050edc80226.webp



          ea8ca13a56caa49f4484f531b0bd3e8a.webp



          最后根據(jù)規(guī)則來進(jìn)行變色



          b09f74df6c21bae5cf0378f3849c1ef3.webp



          如此一來,我們的紅黑樹變得重新符合規(guī)則。這一個(gè)例子的調(diào)整過程比較復(fù)雜,經(jīng)歷了如下步驟:


          變色 -> 左旋轉(zhuǎn) -> 變色 -> 右旋轉(zhuǎn) -> 變色



          c7f04fd1f49a656859e8898575289ffe.webp



          fe31324b048fd3ff569a333c4e97ab7f.webp



          fa21500341d7551c44de58870a840b55.webp



          7fee96c68256066df89b33a73fda8cf5.webp



          幾點(diǎn)說明:


          1. 關(guān)于紅黑樹自平衡的調(diào)整,插入和刪除節(jié)點(diǎn)的時(shí)候都涉及到很多種Case,由于篇幅原因無法展開來一一列舉,有興趣的朋友可以參考維基百科,里面講的非常清晰。


          2.漫畫中紅黑樹調(diào)整過程的示例是一種比較復(fù)雜的情形,沒太看明白的小伙伴也不必鉆牛角尖,關(guān)鍵要懂得紅黑樹自平衡調(diào)整的主體思想。




          —————END—————


          歡迎加入交流群學(xué)習(xí),備注加群說實(shí)話在這個(gè)群,哪怕您不說話,光看聊天記錄,都能學(xué)到東西e2faca5e6c98b794a60246d192d044ed.webp


          推薦阿里云推廣服務(wù)器89/年,229/3年,買來送自己,送女朋友馬上過年再合適不過了,買了搭建個(gè)項(xiàng)目給面試官看也香,還可以熟悉技術(shù)棧,(老用戶用家人賬號(hào)買就好了,我用我女朋友的?)。掃碼購買


          搭建教程,從0開始一步一步帶你搭建?1c0a36d0342a3117749d0bcdf5b10f68.webp

          瀏覽 123
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  999国产精品999久久久久久 | 高清无码18 | 福利看片| 北条麻妃 无码 在线 视频 | 豆花视频免费版 |