红黑树最多三次旋转达到平衡

一点基础

五个性质

  1. 节点是红色或黑色
  2. 根节点是黑色
  3. 所有叶子节点是黑色(叶子节点是NIL节点,为了性质5到叶子节点具有相同数目黑色节点)
  4. 从每个叶子到根的所有路径上不能有两个连续的红色节点
  5. 从任一节点到其叶子的所有路径包含相同数目黑色节点

旋转

左旋

左旋.png

右旋

右旋.png

子节点

  • 为了方便后面讲解插入和删除,这里定义个子节点指代非叶子节点(NIL)

插入

  • 默认插入的子节点总是红色的,因为插入黑色的,肯定会破坏性质5;下面根据插入子节点的父亲颜色分三种情况讨论
  1. 没有父亲节点,父亲节点无颜色,插入子节点作为新的根节点,变为黑色,结束;
  2. 父亲节点为黑色,插入子节点未破坏任何性质,结束;
  3. 父亲节点为红色,可以分为两种情况讨论
    1. 叔叔节点为红色
    2. 叔叔节点为黑色子节点或叶子节点,可以根据插入子节点是否与父亲节点在同一边,分为两种情况讨论
      1. 和父亲节点不在同一边
      2. 和父亲节点在同一边
  • 这就是插入节点所面对的所有情况了,一次插入平衡的流程如下:
    插入平衡流程图.PNG

旋转次数

  • 从流程图可以看出,一次插入最多2次旋转,是父红叔不红,插入子节点与父节点不在同一边时

父亲为红色子节点的三种情况

父叔都为红

  • 将叔叔节点变为黑色,祖父节点变为红色,这样没有破坏任何性质
  • 需要协调祖父节点为红色的问题,把祖父节点当成新插入的节点再处理一次即可


    Red-black_tree_insert_case_3.png

父红叔不为红,插入子节点和父亲不在同一边

  • 这种情况思路是把这边多余红色分到另一边去,再同一边时可旋转改变,所以需要把插入子节点旋转到和父亲节点在同一边


    Red-black_tree_insert_case_4.png

父红叔不为红,插入子节点和父亲在同一边

  • 这种情形经过一次旋转变色可以达到把多的红色分到另一边的目的,因为另一边是黑色,加一个红色节点不会破坏性质


    Red-black_tree_insert_case_5.png

删除

  • 删除要复杂些,不能从颜色的层面看所有情况,需要从删除节点的儿子子节点情况来看,同样分为三类
    • 有二个子节点
    • 有一个子节点
    • 没有子节点

有二个子节点

  • 思路:找到左边或右边最小或最大的子节点,替换删除节点,没有改变颜色,最小或最大节点之上什么都没被影响,问题被转换为了有一个子节点或没有子节点,因为找的是最小或最大的,至少有一边是没有的;流程如下:
    删除有二个子节点流程图.PNG

有一个子节点

  • 删除节点不能为红色:因为他有一个子节点,根据性质4这个子节点肯定是黑色,而这会导致删除节点没有子节点的边到叶子节点的黑色节点至少少1,违反性质5,所以删除节点不能为红色
  • 删除节点为黑色:同样的,根据性质5,删除节点的这个儿子子节点肯定是红色,不然就违反了性质5;只需要简单的去掉删除节点,再用儿子子节点替代他的位置,变为黑色;结束

没有子节点

  1. 删除节点是红色,删除不影响红黑树性质,直接删除

  2. 删除节点是黑色

    • 问题:到删除节点这里的叶子节点的路径上少了个黑色节点,违反了性质5

    • 思路

      • 减少一个删除节点父亲节点到叶子节点路径的黑色节点,把父亲节点当做新的填充上去的节点(第一次填充的是叶子节点),递归处理
      • 在不增加另一边父亲节点到叶子节点的黑色节点数量的情况下,将删除节点这边增加个黑色节点
    • 情形(N:代表删除节点被移除后,补上去的节点,最开始是叶子节点(NIL))

      1. N是新的根,结束
      2. 兄弟是红色
      3. 兄弟是黑色
        1. 兄弟的儿子都是黑色
          1. 父亲节点是黑色
          2. 父亲节点是红色
        2. 兄弟的儿子有红色
          1. 兄弟儿子与兄弟同边的是黑色
          2. 兄弟儿子与兄弟同边的是红色

      这就是当删除节点没有子节点并且删除节点是黑色的时候所有的情形了,它的平衡流程图如下:


      无子节点流程图.PNG

旋转次数

  • 从流程图不难看出,删除最多旋转3次,情形为:兄弟是红色->兄弟黑色、兄儿子与兄不同边红色,同边黑色、父亲节点颜色红黑都可->兄弟黑色、兄儿子与兄同边红色,另一边红黑都可、父亲节点颜色红黑都可

兄弟是红色

  • 需要转换为填充节点是黑色的情形
  • 将红色的兄节点旋转到父亲节点位置,并交换之前父亲节点和兄节点颜色,这样可以保持和之前一致的到叶节点黑色数目,并使填充节点N的新兄节点为黑色


    Red-black_tree_delete_case_2.png

兄弟黑色、兄儿子黑色、父亲节点黑色

  • 没有红色可以做转换,将兄变为红色,以父亲作为新的补充节点N循环处理


    Red-black_tree_delete_case_3.png

兄弟黑色、兄儿子是黑色、父亲节点是红色

  • 直接交换父亲节点和兄节点颜色;颜色满足,到叶子节点的的黑色数目没变,N这边加了1(父亲),兄这边没变,达到平衡


    Red-black_tree_delete_case_4.png

兄弟黑色、兄儿子与兄同边红色,另一边红黑都可、父亲节点颜色红黑都可

  • (白色节点表示红黑都可以,但必须维持和删除钱一样颜色)以父节点旋转,将兄节点旋转到父亲的位置,并将与兄同边的儿子变为黑色,而原父节点变为黑色,在父节点那个位置的子节点颜色与之前保持一致,这样相当于N这边增加了一个黑色,原父节点;而兄那边S节点顶替了父节点位置与颜色,但与兄同边儿子红色节点变为了黑色,加上了1,刚好持平,局部达到了平衡,达到平衡


    Red-black_tree_delete_case_6.png

兄弟黑色、兄儿子与兄不同边红色,同边黑色、父亲节点颜色红黑都可

  • 将兄儿子红色不同边旋转到与兄同边,并交换兄和这个节点颜色,即可以形成兄弟黑色、兄儿子与兄同边红色,另一边红黑都可、父亲节点颜色红黑都可情形
    Red-black_tree_delete_case_5.png

小结

  • 从上面插入和删除知道:插入最多2次旋转达到平衡、删除最多3次旋转达到平衡;所以红黑树最多三次旋转达到平衡

参考:红黑树-维基百科

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • 背景 红黑树,是一个比较复杂的数据结构。让我们分析一下,整个AVL树的性质。AVL最明显的特点就是,每个节点左右子...
    yjy239阅读 1,263评论 1 1
  • 作为一名年轻的叫狮,开发斜杠能力,做一名斜杠青年,小编私以为还是很重要的,没有什么工作是绝对的稳定,真正稳定的,是...
    ITsCLG阅读 1,781评论 0 3
  • 1、红黑树介绍 红黑树又称R-B Tree,全称是Red-Black Tree,它是一种特殊的二叉查找树,红黑树的...
    文哥的学习日记阅读 9,870评论 1 35
  • 1、引言 在二叉树中已经探讨过,如果按照随机顺序插入树节点,绝大多数都会出现不平衡的情况。最坏的情况,插入的数据时...
    冰河winner阅读 1,623评论 0 3
  • 首先在分析红黑树删除操作之前先说明一下搜索二叉树中删除一个节点时的一个技巧。当删除节点位与树的内节点时,这个时候可...
    Nier_if阅读 2,626评论 2 10