數(shù)據(jù)結構-紅黑樹學習筆記(轉)

rbt(紅黑樹)

圖解紅黑樹:http://www.reibang.com/p/0eaea4cc5619
數(shù)據(jù)結構可視化網(wǎng)站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
demo:https://github.com/lilingyan/take-TreeMap-apart

AVL插入時平衡次數(shù)較多件余,RBT是AVL的折中方法(放寬平衡冗余糕珊,減少插入后平衡次數(shù))嘲驾,插入刪除效率略高于AVL员萍,查詢效率略低于AVL

  • 插入調(diào)整時(最壞的情況(需要回溯到頂))
    • avl是一層一層向上(logN)
    • rbt是兩層兩層向上(logN/2)
  • 插入調(diào)整時(最壞的情況(需要回溯到頂))
    • rbt在回溯的時候,只要碰到紅色就結束了挥等,所以略好于avl
  • 查詢時(rbt最壞情況是左右子樹差一倍高度)

rbt必定是bst
rbt任意黑節(jié)點為根的子樹必定是rbt(遞歸)

紅黑樹的5個性質

  1. 節(jié)點必須是紅色或者黑色(所有葉子節(jié)點是NIL節(jié)點)捕仔。
  2. 根節(jié)點必須是黑色。
  3. 葉節(jié)點(NIL)是黑色的歧杏。(NIL節(jié)點無數(shù)據(jù),是空節(jié)點)
  4. 紅色節(jié)點必須有兩個黑色兒子節(jié)點 (所以父節(jié)點必定也是黑色)迷守。
  5. 從任一節(jié)點出發(fā)到其每個葉子節(jié)點的路徑,黑色節(jié)點的數(shù)量是相等的(黑高 BlackHeight bh 實際應用中旺入,可以忽略NIL節(jié)點兑凿,所以黑高少1)。

以上條件能保證任意同級子樹高度差不超過2倍

  • BH(left)==BH(right)
  • 若H(left)>=H(right) 則H(left)<=2*H(right)+1
  • 若H(left)<=H(right) 則H(right)<=2*H(left)+1

定理:n個節(jié)點的RBT,最大高度是2log(n+1)

插入節(jié)點都默認紅色(因為插入黑色茵瘾,那必定黑高不平衡礼华,就必須要調(diào)整了,就和avl一樣了拗秘。所以插入紅色圣絮,有部分幾率不需要調(diào)整)

調(diào)整
自底向上,一層一層的調(diào)整雕旨,直到父節(jié)點為黑色的時候扮匠,或者到根捧请。

  • 插入后情況
    • 不需要調(diào)整(父節(jié)點為黑色;或者插入的是根節(jié)點)
      1. 父節(jié)點是黑色的情況:
        因為rbt基于bst,所以插入的新節(jié)點只可能是葉子節(jié)點
        所以插入的節(jié)點如果父節(jié)點是黑色棒搜,就滿足rbt5條性質疹蛉,不需要調(diào)整
      2. 如果是根節(jié)點,直接把該節(jié)點設置為黑色
    • 需要調(diào)整(父節(jié)點為紅色)
      (由于性質4力麸,祖父節(jié)點必定是黑色)
      叔叔節(jié)點(當前節(jié)點的祖父節(jié)點的另一個子節(jié)點)
      1. ·父節(jié)點·為·祖父節(jié)點·的左孩子的情況
        • case1:·叔叔節(jié)點·是紅色可款。(把父層同時置黑,試滿足第4性質克蚂,然后祖父可能又有沖突(沖突向上拋)闺鲸,所以繼續(xù)遞歸)
          1. 將·父節(jié)點·和·叔叔節(jié)點·設為黑色
          2. 將·祖父節(jié)點·設為紅色
          3. 從·祖父節(jié)點·進行遞歸調(diào)整
        • case2:叔叔節(jié)點是黑色。且當前節(jié)點是其父節(jié)點的右孩子埃叭。(舊父節(jié)點的樹一直滿足5條性質摸恍,把不滿足的當前節(jié)點繼續(xù)遞歸(沖突向上拋))
          1. 將·父節(jié)點·左旋
          2. 從·新父節(jié)點·執(zhí)行case3
        • case3:叔叔節(jié)點是黑色。且當前節(jié)點是其父節(jié)點的左孩子游盲。(因為父節(jié)點和叔叔節(jié)點都是黑色误墓,所以右旋后,祖父節(jié)點必定是黑色益缎,已經(jīng)滿足所有性質谜慌,不需要遞歸了)
          1. 將·父節(jié)點·設為黑色
          2. 將·祖父節(jié)點·設為紅色
          3. 將·祖父節(jié)點·右旋
          4. 從·新當前節(jié)點的右節(jié)點·繼續(xù)進行遞歸調(diào)整(其實到這里就結束了!)
      2. ·父節(jié)點·為·祖父節(jié)點·的右孩子的情況
        與上同理(鏡像)
  • 刪除后情況
    • 不需要調(diào)整(刪除的是紅色節(jié)點莺奔,上下都是黑色節(jié)點欣范,黑高平衡)
      1. 回溯時,如果·當前節(jié)點·是·根節(jié)點·或者是·紅色節(jié)點·令哟,直接置黑
    • 需要調(diào)整(刪除的是黑色節(jié)點恼琼,黑高不平衡)
      兄弟節(jié)點(sib,sibling 當前節(jié)點的父節(jié)點的另一個子節(jié)點)
      左右侄子(nephew,ln,rn 當前節(jié)點的父節(jié)點的另一個子節(jié)點的左右子節(jié)點)
      1. 刪除節(jié)點為·父節(jié)點·的左孩子情況(左黑高低)
        • case1:·兄弟節(jié)點·為紅色。(右樹的根節(jié)點為紅色屏富,所以它下面的兩個子樹黑高一定平衡晴竞。把它父節(jié)點左旋,不影響它黑高平衡)(最終右黑高還是比做黑高大)
          1. 將·兄弟節(jié)點·設為黑色
          2. 將·父節(jié)點·設為紅色
          3. 將·父節(jié)點·左旋
        • case2:·兄弟節(jié)點·為黑色;·左右侄子節(jié)點·為黑色
          1. 將·兄弟節(jié)點·設為紅色
          2. 從·父節(jié)點·進行遞歸調(diào)整狠半。
        • case3:·兄弟節(jié)點·為黑色;·左侄子節(jié)點·為紅色;·右侄子節(jié)點·為黑色噩死。(兄弟子樹的黑高被減,然后把多的黑高向上拋)(必定兄弟節(jié)點為黑色神年,右侄子節(jié)點為紅色已维,后一步必定是case4)
          1. 將·左侄子節(jié)點·設為黑色
          2. 將·兄弟節(jié)點·設為紅色
          3. 將·兄弟節(jié)點·右旋
        • case4:·兄弟節(jié)點·為黑色;·右侄子節(jié)點·為紅色。
          (如果父節(jié)點為黑色已日,左旋的時候垛耳,帶走了左侄子節(jié)點,然后右侄子節(jié)點又被置為了黑色(黑高加一,又因為父節(jié)點被左旋堂鲜,黑高減一栈雳,所以不動)而原來黑高少的左子樹因為被加了一個黑色的父節(jié)點,所以黑高和右子樹一樣了泡嘴;
          如果父節(jié)點是紅色甫恩,左旋同時設置兄弟節(jié)點為紅色(新父節(jié)點還是紅色),右子樹黑高被減一酌予,左侄子節(jié)點被帶到左子樹(同樣掛到黑節(jié)點下磺箕,黑高不變),左子樹上方則加了一個黑色節(jié)點抛虫,最終左右平衡)
          1. 將·兄弟節(jié)點·設為·父節(jié)點·的顏色
          2. 將·父節(jié)點·設為黑色
          3. 將·右侄子節(jié)點·設為黑色
          4. 將·父節(jié)點·左旋
          5. 結束(因為原本減去的黑高又被加回來了松靡,所以沒必要再繼續(xù)調(diào)整了)
            執(zhí)行意義{
            case2執(zhí)行完后,如果執(zhí)行case1建椰,并且最后·父節(jié)點·是黑色(現(xiàn)在左右黑高已經(jīng)相等雕欺,但是·父節(jié)點·是黑色,所以不能保證·父節(jié)點·還平衡棉姐,需要遞歸調(diào)整)
            case2執(zhí)行完后屠列,如果執(zhí)行case2,并且最后·父節(jié)點·是紅色(直接把·父節(jié)點·置黑伞矩,剛好補全了因為刪除和·兄弟節(jié)點·置紅而降低的黑高笛洛,結束)
            }
      2. 刪除節(jié)點為·父節(jié)點·的右孩子情況
        • 與上同理(鏡像)
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市乃坤,隨后出現(xiàn)的幾起案子苛让,更是在濱河造成了極大的恐慌,老刑警劉巖湿诊,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狱杰,死亡現(xiàn)場離奇詭異,居然都是意外死亡厅须,警方通過查閱死者的電腦和手機仿畸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朗和,“玉大人错沽,你說我怎么就攤上這事±。” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵抢蚀,是天一觀的道長镀层。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么唱逢? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任吴侦,我火速辦了婚禮,結果婚禮上坞古,老公的妹妹穿的比我還像新娘备韧。我一直安慰自己,他們只是感情好痪枫,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布织堂。 她就那樣靜靜地躺著,像睡著了一般奶陈。 火紅的嫁衣襯著肌膚如雪易阳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天吃粒,我揣著相機與錄音潦俺,去河邊找鬼。 笑死徐勃,一個胖子當著我的面吹牛事示,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播僻肖,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼肖爵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了檐涝?” 一聲冷哼從身側響起遏匆,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谁榜,沒想到半個月后幅聘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡窃植,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年帝蒿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巷怜。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡葛超,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出延塑,到底是詐尸還是另有隱情绣张,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布关带,位于F島的核電站侥涵,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜芜飘,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一务豺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嗦明,春花似錦笼沥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至裙戏,卻和暖如春乘凸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背累榜。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工营勤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人壹罚。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓葛作,卻偏偏與公主長得像,于是被迫代替她去往敵國和親猖凛。 傳聞我的和親對象是個殘疾皇子赂蠢,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

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

  • 紅黑樹是一種自平衡二叉查找樹,與 AVL 樹類似辨泳,提供 級別的查詢虱岂、插入和刪除節(jié)點復雜度。相對于 AVL 樹單純...
    zhipingChen閱讀 1,380評論 1 5
  • 紅黑樹是平衡二叉查找樹的一種菠红。為了深入理解紅黑樹第岖,我們需要從二叉查找樹開始講起。 BST 二叉查找樹(Binary...
    kanehe閱讀 1,370評論 0 8
  • 紅黑樹是一棵自平衡的二叉搜索樹试溯,因此在學習紅黑樹之前蔑滓,我們需要回顧一下之前所學的知識二叉搜索樹和平衡二叉樹。 1....
    紅橙Darren閱讀 14,972評論 14 336
  • 1.平衡與非平衡樹 樹的平衡樹的平衡指的是:樹中每個節(jié)點的左邊后代的數(shù)目遇绞,應該和其右邊后代的數(shù)目大致相等键袱。對于隨機...
    王偵閱讀 354評論 0 0
  • 背景 紅黑樹,是一個比較復雜的數(shù)據(jù)結構摹闽。讓我們分析一下蹄咖,整個AVL樹的性質。AVL最明顯的特點就是付鹿,每個節(jié)點左右子...
    yjy239閱讀 1,252評論 1 1