红黑树的插入和删除(真正讲清楚删除)

回顾红黑树5个性质:

  1. 红黑树的节点不是黑色的就是红色的
  2. 红黑树的根节点一定是黑色的
  3. 红黑树的所有叶子节点都是黑色的(注意:红黑树的叶子节点指Null节点)
  4. 红黑树任何路径上不允许出现相邻两个红色节点
  5. 从红黑树的任一节点开始向下到任意叶子节点所经过的黑色节点数目相同

性质分析:
1.前3条性质很好理解
2.第4条性质是指红色节点不能相连,必须被黑色节点隔开
3.第5条性质如果被打破,比第4条性质更难恢复,情况会更复杂
4.根节点到叶子节点的路径上,红色节点数不会超过黑色节点数,最长路径不会大于最短路径的两倍
5.树上的黑色节点是平衡的

基于性质分析第3条,插入和删除的时候,都优先操作红色节点以便满足性质5,再进行调整以便满足性质4
调整时,若节点没有左/右子节点时,则将其叶子节点(Null节点)考虑进来,当成黑色子节点,简化分类情形
在实际处理时,子节点为空或子节点为黑色,采取相同处理措施,可得到相同的结果


插入思路:
1.确定插入位置
2.创建红色的新节点(i),插入该位置
3.判断父节点(p)是否为黑色
4.父节点(p)为红色则需再调整(为黑色无需调整)
 因父节点是红色,则祖父节点必是黑色
 4.1叔叔节点(u)是红色的
  将祖父节点(g)的黑色交给其子节点,各条路径上的黑色节点数不变,同时达到分离红色节点的目的,如图一
  但祖父节点(g)的父节点(gp)可能也是红色,需要以祖父节点(g)的视角再做处理
  图一只考虑了叔叔节点(u)无子节点的情况,所以需要补充考虑叔叔节点(u)有子节点的情况
  叔叔节点(u)有子节点的情况,处理方式不变,如图二,如果祖父节点(g)是根节点,则将祖父节点(g)置为黑色
 4.2叔叔节点(u)是黑色的
  可通过旋转将一个红色转移到叔叔节点(u)所在子树上,各条路径上的黑色节点数不变,如图三

【图一】将g的黑色给两个子节点

【图二】将g的黑色给两个子节点

【图三】右旋分离红色节点

删除思路:
先按欲删除节点(d)的子节点个数分类

1.欲删除节点(d)有两个子节点时不好直接处理,需要转化成只有一个子节点或没有子节点的情形

 转化细节可阅读: 红黑树删除节点有两个子节点的转化分析

2.欲删除节点(d)只有一个子节点

 子节点必然是红色,欲删除节点(d)是黑色
 如果子节点是黑色,则欲删除节点(d)左右子树的黑色节点数不一致
 此时交换欲删除节点(d)和子节点的值,删除子节点或者交换欲删除节点(d)和子节点的颜色,删除欲删除节点(d)

3.欲删除节点(d)没有子节点

欲删除节点(d)如果是黑色,通过调整将其变成红色,更易于删除

 3.1欲删除节点(d)是红色,可直接删除
 3.2欲删除节点(d)是黑色

 此时需要考虑父节点(p),兄弟节点(b),兄弟节点的子节点的状态,分类处理
  第一种情况:父节点、兄弟节点、兄弟节点的子节点都是黑色时,向父节点的上层借红色
  第二种情况:兄弟节点的子节点有红色时,转移其红色给当前节点
  第三种情况:兄弟节点的子节点都是黑色,但父节点是红色时,转移父节点的红色给其子节点
  第四种情况:兄弟节点(b)是红色时,通过旋转,转化成第二、三种情况


下面来详细分析这几种情况的处理

3.2.1父节点(p),兄弟节点(b),兄弟节点的子节点都是黑色

  此时只能将欲删除节点(d)与兄弟节点(b)的黑色给父节点(p),父节点(p)变成双黑,如图四
  再以父节点(p)的视角再做处理,处理之后父节点(p)的双黑将变回黑色,如图五
  我们可以将红色看成是0级的黑,双黑看成是2级的黑,我们的操作都是将当前节点的黑色等级降1级

3.2.2兄弟节点同向的子节点是红色的

  以父节点为支点旋转,从父节点的另一边的子树中借红色,
  各条路径的黑色节点数不变,如图六

3.2.3兄弟节点反向的子节点是红色的

  以兄弟节点为支点旋转,转化成3.2.2的情况

3.2.4兄弟节点的子节点都是黑色,父节点是红色

  直接从父节点借红色,如图八

3.2.5兄弟节点是红色

  以父节点为支点旋转,转化为其他几种情况,如图九

【图四】将黑色转移给父节点

【图五】将黑色转移给父节点

【图六】左旋从右子树借红色

【图七】右旋转化成另一种情况

【图八】从父节点借红色

【图九】兄弟节点为红色时旋转,转化成其他情形

说明:图六至图九,d可能为黑色节点,也可能为双黑节点


理解了插入和删除的思路后,再来阅读TreeMap和HashMap中红黑树源码,则更能加深理解
建议先阅读TreeMap源码,再阅读HashMap源码,TreeMap源码更有逻辑性,易于理解
TreeMap和HashMap中红黑树源码解读

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