数据结构-红黑树学习笔记(转)

rbt(红黑树)

图解红黑树:https://www.jianshu.com/p/0eaea4cc5619
数据结构可视化网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
demo:https://github.com/lilingyan/take-TreeMap-apart

AVL插入时平衡次数较多,RBT是AVL的折中方法(放宽平衡冗余,减少插入后平衡次数),插入删除效率略高于AVL,查询效率略低于AVL

  • 插入调整时(最坏的情况(需要回溯到顶))
    • avl是一层一层向上(logN)
    • rbt是两层两层向上(logN/2)
  • 插入调整时(最坏的情况(需要回溯到顶))
    • rbt在回溯的时候,只要碰到红色就结束了,所以略好于avl
  • 查询时(rbt最坏情况是左右子树差一倍高度)

rbt必定是bst
rbt任意黑节点为根的子树必定是rbt(递归)

红黑树的5个性质

  1. 节点必须是红色或者黑色(所有叶子节点是NIL节点)。
  2. 根节点必须是黑色。
  3. 叶节点(NIL)是黑色的。(NIL节点无数据,是空节点)
  4. 红色节点必须有两个黑色儿子节点 (所以父节点必定也是黑色)。
  5. 从任一节点出发到其每个叶子节点的路径,黑色节点的数量是相等的(黑高 BlackHeight bh 实际应用中,可以忽略NIL节点,所以黑高少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个节点的RBT,最大高度是2log(n+1)

插入节点都默认红色(因为插入黑色,那必定黑高不平衡,就必须要调整了,就和avl一样了。所以插入红色,有部分几率不需要调整)

调整
自底向上,一层一层的调整,直到父节点为黑色的时候,或者到根。

  • 插入后情况
    • 不需要调整(父节点为黑色;或者插入的是根节点)
      1. 父节点是黑色的情况:
        因为rbt基于bst,所以插入的新节点只可能是叶子节点
        所以插入的节点如果父节点是黑色,就满足rbt5条性质,不需要调整
      2. 如果是根节点,直接把该节点设置为黑色
    • 需要调整(父节点为红色)
      (由于性质4,祖父节点必定是黑色)
      叔叔节点(当前节点的祖父节点的另一个子节点)
      1. ·父节点·为·祖父节点·的左孩子的情况
        • case1:·叔叔节点·是红色。(把父层同时置黑,试满足第4性质,然后祖父可能又有冲突(冲突向上抛),所以继续递归)
          1. 将·父节点·和·叔叔节点·设为黑色
          2. 将·祖父节点·设为红色
          3. 从·祖父节点·进行递归调整
        • case2:叔叔节点是黑色。且当前节点是其父节点的右孩子。(旧父节点的树一直满足5条性质,把不满足的当前节点继续递归(冲突向上抛))
          1. 将·父节点·左旋
          2. 从·新父节点·执行case3
        • case3:叔叔节点是黑色。且当前节点是其父节点的左孩子。(因为父节点和叔叔节点都是黑色,所以右旋后,祖父节点必定是黑色,已经满足所有性质,不需要递归了)
          1. 将·父节点·设为黑色
          2. 将·祖父节点·设为红色
          3. 将·祖父节点·右旋
          4. 从·新当前节点的右节点·继续进行递归调整(其实到这里就结束了!)
      2. ·父节点·为·祖父节点·的右孩子的情况
        与上同理(镜像)
  • 删除后情况
    • 不需要调整(删除的是红色节点,上下都是黑色节点,黑高平衡)
      1. 回溯时,如果·当前节点·是·根节点·或者是·红色节点·,直接置黑
    • 需要调整(删除的是黑色节点,黑高不平衡)
      兄弟节点(sib,sibling 当前节点的父节点的另一个子节点)
      左右侄子(nephew,ln,rn 当前节点的父节点的另一个子节点的左右子节点)
      1. 删除节点为·父节点·的左孩子情况(左黑高低)
        • case1:·兄弟节点·为红色。(右树的根节点为红色,所以它下面的两个子树黑高一定平衡。把它父节点左旋,不影响它黑高平衡)(最终右黑高还是比做黑高大)
          1. 将·兄弟节点·设为黑色
          2. 将·父节点·设为红色
          3. 将·父节点·左旋
        • case2:·兄弟节点·为黑色;·左右侄子节点·为黑色
          1. 将·兄弟节点·设为红色
          2. 从·父节点·进行递归调整。
        • case3:·兄弟节点·为黑色;·左侄子节点·为红色;·右侄子节点·为黑色。(兄弟子树的黑高被减,然后把多的黑高向上抛)(必定兄弟节点为黑色,右侄子节点为红色,后一步必定是case4)
          1. 将·左侄子节点·设为黑色
          2. 将·兄弟节点·设为红色
          3. 将·兄弟节点·右旋
        • case4:·兄弟节点·为黑色;·右侄子节点·为红色。
          (如果父节点为黑色,左旋的时候,带走了左侄子节点,然后右侄子节点又被置为了黑色(黑高加一,又因为父节点被左旋,黑高减一,所以不动)而原来黑高少的左子树因为被加了一个黑色的父节点,所以黑高和右子树一样了;
          如果父节点是红色,左旋同时设置兄弟节点为红色(新父节点还是红色),右子树黑高被减一,左侄子节点被带到左子树(同样挂到黑节点下,黑高不变),左子树上方则加了一个黑色节点,最终左右平衡)
          1. 将·兄弟节点·设为·父节点·的颜色
          2. 将·父节点·设为黑色
          3. 将·右侄子节点·设为黑色
          4. 将·父节点·左旋
          5. 结束(因为原本减去的黑高又被加回来了,所以没必要再继续调整了)
            执行意义{
            case2执行完后,如果执行case1,并且最后·父节点·是黑色(现在左右黑高已经相等,但是·父节点·是黑色,所以不能保证·父节点·还平衡,需要递归调整)
            case2执行完后,如果执行case2,并且最后·父节点·是红色(直接把·父节点·置黑,刚好补全了因为删除和·兄弟节点·置红而降低的黑高,结束)
            }
      2. 删除节点为·父节点·的右孩子情况
        • 与上同理(镜像)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容

  • 红黑树是一种自平衡二叉查找树,与 AVL 树类似,提供 级别的查询、插入和删除节点复杂度。相对于 AVL 树单纯...
    zhipingChen阅读 1,384评论 1 5
  • 红黑树是平衡二叉查找树的一种。为了深入理解红黑树,我们需要从二叉查找树开始讲起。 BST 二叉查找树(Binary...
    kanehe阅读 1,370评论 0 8
  • 红黑树是一棵自平衡的二叉搜索树,因此在学习红黑树之前,我们需要回顾一下之前所学的知识二叉搜索树和平衡二叉树。 1....
    红橙Darren阅读 14,983评论 14 336
  • 1.平衡与非平衡树 树的平衡树的平衡指的是:树中每个节点的左边后代的数目,应该和其右边后代的数目大致相等。对于随机...
    王侦阅读 356评论 0 0
  • 背景 红黑树,是一个比较复杂的数据结构。让我们分析一下,整个AVL树的性质。AVL最明显的特点就是,每个节点左右子...
    yjy239阅读 1,258评论 1 1