紅黑樹

圖片源自網(wǎng)絡(luò),侵刪

介紹

紅黑樹是一種自平衡二叉查找樹,原先被稱作平衡二叉B樹(symmetric binary B-trees)后來更名為紅黑樹(Red-Black Tree)。

與其他二叉查找樹類似,都是在插入和刪除操作時(shí)通過調(diào)整樹的結(jié)構(gòu)來保持二叉查找樹的平衡。相比于AVL樹,他沒有那么嚴(yán)格,所以在插入和刪除時(shí),調(diào)整樹的結(jié)構(gòu)這種操作相對來說較少,所以擁有不錯的性能。

性質(zhì)

一個樹要是紅黑樹則必須滿足以下五點(diǎn)性質(zhì)。

  1. 樹的節(jié)點(diǎn)顏色非黑即紅。
  2. 根節(jié)點(diǎn)是黑色。
  3. 把空節(jié)點(diǎn)認(rèn)為是黑色葉子節(jié)點(diǎn)。
  4. 每個紅色節(jié)點(diǎn)的兩個子節(jié)點(diǎn)都是黑色。
  5. 任一節(jié)點(diǎn)到葉子節(jié)點(diǎn)的所有路徑中,他們包含的黑色節(jié)點(diǎn)數(shù)相同。

操作

  1. 查找

    由于紅黑樹同時(shí)也是二叉查找樹,所以查找操作與二叉查找樹一致。從根節(jié)點(diǎn)進(jìn)入,查找的值比當(dāng)前節(jié)點(diǎn)小,則查其左子樹;查找的值比當(dāng)前節(jié)點(diǎn)大,則查詢其右子樹;相等則查詢成功。

  1. 插入

    插入新節(jié)點(diǎn)時(shí),通常將這個節(jié)點(diǎn)標(biāo)記為紅色。(因?yàn)槿绻切鹿?jié)點(diǎn)是黑色的話,肯定會破壞紅黑樹的性質(zhì)5,而紅色則不一定會破壞)

    紅黑樹插入時(shí)可能會導(dǎo)致樹不滿足紅黑樹的性質(zhì),此時(shí)我們要通過一些操作來對樹進(jìn)行調(diào)整從而使他再次成為紅黑樹。調(diào)整方式有以下三種。

    1. 變色

      紅色變黑色,黑色變紅色。

    2. 左旋

      將當(dāng)前節(jié)點(diǎn)的右節(jié)點(diǎn)變?yōu)楫?dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn),當(dāng)前節(jié)點(diǎn)的右節(jié)點(diǎn)的左子樹變?yōu)楫?dāng)前節(jié)點(diǎn)的右子樹。具體如下圖:

      8NqI6f.gif
    3. 右旋

      將當(dāng)前節(jié)點(diǎn)的左節(jié)點(diǎn)變成當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn),當(dāng)前節(jié)點(diǎn)的左節(jié)點(diǎn)的右子樹變?yōu)楫?dāng)前節(jié)點(diǎn)的左子樹。具體如下圖:

      8Nqvpq.gif

    插入則有如下幾種情形:

    • 當(dāng)前樹為空

      為了滿足性質(zhì)2,此時(shí)我們只需要新建一個節(jié)點(diǎn),將他的顏色設(shè)為黑色,作為根節(jié)點(diǎn)即可。

    • 插入點(diǎn)已存在

      直接更新節(jié)點(diǎn)

    • 插入點(diǎn)的父節(jié)點(diǎn)為黑色

      不會影響黑色完美平衡,仍然滿足紅黑樹所有性質(zhì),直接插入即可

    • 插入點(diǎn)的父節(jié)點(diǎn)為紅色
      1. 父節(jié)點(diǎn)的兄弟節(jié)點(diǎn)為紅色

        此時(shí)違背了紅黑樹的性質(zhì)4,此時(shí)我們應(yīng)當(dāng)采用變色策略,將祖父節(jié)點(diǎn)變?yōu)榧t色,父節(jié)點(diǎn)和父節(jié)點(diǎn)的兄弟節(jié)點(diǎn)變?yōu)楹谏?,然后再將?dāng)前節(jié)點(diǎn)設(shè)為祖父節(jié)點(diǎn),進(jìn)行下一步處理。(當(dāng)父親節(jié)點(diǎn)和父親節(jié)點(diǎn)的兄弟節(jié)點(diǎn)都是紅色的時(shí)候改變祖父,父,父的兄弟的顏色不會破壞黑色平衡,所以可以這么做)

        8NjPHS.png
      2. 父節(jié)點(diǎn)的兄弟節(jié)點(diǎn)為黑色

        • 父節(jié)點(diǎn)為祖父節(jié)點(diǎn)的左節(jié)點(diǎn)并且當(dāng)前節(jié)點(diǎn)是父節(jié)點(diǎn)的左節(jié)點(diǎn)(LL雙紅)

          祖父節(jié)點(diǎn)變紅,父節(jié)點(diǎn)變黑,然后對祖父節(jié)點(diǎn)進(jìn)行右旋

          8Uk538.png
        • 父節(jié)點(diǎn)為祖父節(jié)點(diǎn)的左節(jié)點(diǎn)并且當(dāng)前節(jié)點(diǎn)是父節(jié)點(diǎn)的左節(jié)點(diǎn)(LR雙紅)

          先對父節(jié)點(diǎn)進(jìn)行左旋操作,然后就會變成LL雙紅,然后在進(jìn)行LL雙紅操作

          8UAA4x.png
        • 父節(jié)點(diǎn)為祖父節(jié)點(diǎn)的右節(jié)點(diǎn)并且當(dāng)前節(jié)點(diǎn)是父節(jié)點(diǎn)的右節(jié)點(diǎn)(RR雙紅)

          祖父節(jié)點(diǎn)變紅,父節(jié)點(diǎn)變黑,然后對祖父節(jié)點(diǎn)進(jìn)行左旋

          8UVMtI.png
        • 父節(jié)點(diǎn)為祖父節(jié)點(diǎn)的右節(jié)點(diǎn)并且當(dāng)前節(jié)點(diǎn)是父節(jié)點(diǎn)的左節(jié)點(diǎn)(RL雙紅)

          對父節(jié)點(diǎn)進(jìn)行右旋操作,然后就會變成RR雙紅,然后再進(jìn)行RR雙紅操作

          8UV536.png
  1. 刪除

    //TODO
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、紅黑樹介紹 紅黑樹又稱R-B Tree,全稱是Red-Black Tree,它是一種特殊的二叉查找樹,紅黑樹的...
    文哥的學(xué)習(xí)日記閱讀 10,133評論 1 35
  • 上一篇:Java集合-ConcurrentHashMap工作原理和實(shí)現(xiàn)JDK8 本文學(xué)習(xí)知識點(diǎn) 1、二叉查找樹,以...
    Misout閱讀 14,048評論 9 67
  • 之前在公司組內(nèi)分享了紅黑樹的工作原理,今天把它整理下發(fā)出來,希望能對大家有所幫助,對自己也算是一個知識點(diǎn)的總結(jié)。 ...
    JasonGaoH閱讀 1,127評論 1 14
  • 之前在公司組內(nèi)分享了紅黑樹的工作原理,今天把它整理下發(fā)出來,希望能對大家有所幫助,對自己也算是一個知識點(diǎn)的總結(jié)。 ...
    Java旺閱讀 541評論 0 3
  • apk簽名簡介 所有的Android應(yīng)用程序都要求開發(fā)人員用一個證書進(jìn)行數(shù)字簽名,Android系統(tǒng)不會安裝沒有進(jìn)...
    shellever閱讀 8,196評論 7 14

友情鏈接更多精彩內(nèi)容