引言:
目前国内图书市场上,抑或网上讲解红黑树的资料层次不齐,混乱不清,没有一个完整而统一的阐述。而本人的红黑树系列四篇文章(详见文末的参考文献),虽然从头至尾,讲的有根有据,层次清晰,然距离读者真正做到红黑树了然于胸,则还缺点什么。
而我们知道,即便在经典的算法导论一书上,也没有把所有的插入、删除情况一一道尽,直接导致了不少读者的迷惑,而我的红黑树系列第4篇文章:一步一图一代码,一定要让你真正彻底明白红黑树,虽然早已把所有的插入、删除情况都一一道尽了,但也缺了点东西。
缺点什么东西列?对了,缺的就是一个完完整整的,包含所有插入、删除情况全部过程的全程演示图,即缺一个例子,缺一个完整的图来从头至尾阐述这一切。
ok,本文,即以40幅图来全程演示此红黑树的所有插入,和删除情况。相信,一定会对您理解红黑树有所帮助。
话不絮烦,下面,本文便以此篇文章:一步一图一代码,一定要让你真正彻底明白红黑树为纲,从插入一个结点到最后插入全部结点,再到后来一个一个把结点全部删除的情况一一阐述。
由于为了有个完整统一,红黑树插入和删除情况在此合作成一篇文章。同时,由于本人的红黑树系列的四篇文章已经把红黑树的插入、删除情况都一一详尽的阐述过了,因此,有关红黑树的原理,本文不再赘述,只侧重于用图来一一全程演示结点的插入和删除情况。有任何问题,欢迎指正。
红黑树插入情况全过程演示
通过本人的红黑树系列第4篇文章,我们已经知道,红黑树的所有插入情况有以下五种:
情形1: 新节点N位于树的根上,没有父节点
情形2: 新节点的父节点P是黑色
情形3:父节点P、叔叔节点U,都为红色,
[对应第二篇文章中,的情况1:z的叔叔是红色的。]
情形4: 父节点P是红色,叔叔节点U是黑色或NIL;
插入节点N是其父节点P的右孩子,而父节点P又是其父节点的左孩子。
[对应我第二篇文章中,的情况2:z的叔叔是黑色的,且z是右孩子]
情形5: 父节点P是红色,而叔父节点U 是黑色或NIL,
要插入的节点N 是其父节点的左孩子,而父节点P又是其父G的左孩子。
[对应我第二篇文章中,情况3:z的叔叔是黑色的,且z是左孩子。]
详细,可参考此红黑树系列第4篇文章:一步一图一代码,一定要让你真正彻底明白红黑树。
首先,各个结点插入与以上的各种插入情况,一一对应起来,如图:
以下的20张图,是依次插入这些结点:12 1 9 2 0 11 7 19 4 15 18 5 14 13 10 16 6 3 8 17的全程演示图,已经把所有的5种插入情况,都全部涉及到了:
红黑树的一一插入各结点:12 1 9 2 0 11 7 19 4 15 18 5 14 13 10 16 6 3 8 17的全程演示图完。
红黑树删除情况全过程演示
红黑树的所有删除情况,如下:
情况1: N 是新的根。
情形2:兄弟节点S是红色
[对应我第二篇文章中,情况1:x的兄弟w是红色的。]
情况 3: 兄弟节点S是黑色的,且S的俩个儿子都是黑色的。但N的父节点P,是黑色。
[对应我第二篇文章中,情况2:x的兄弟w是黑色的,且兄弟w的俩个儿子都是黑色的。
(这里,N的父节点P为黑)]
情况4: 兄弟节点S 是黑色的、S 的儿子也都是黑色的,但是 N 的父亲P,是红色。
[还是对应我第二篇文章中,情况2:x的兄弟w是黑色的,且w的俩个孩子都是黑色的。
(这里,N的父节点P为红)]
情况5: 兄弟S为黑色,S 的左儿子是红色,S 的右儿子是黑色,而N是它父亲的左儿子。
//此种情况,最后转化到下面的情况6。
[对应我第二篇文章中,情况3:x的兄弟w是黑色的,w的左孩子是红色,w的右孩子是黑色。]
情况6: 兄弟节点S是黑色,S的右儿子是红色,而 N 是它父亲的左儿子。
[对应我第二篇文章中,情况4:x的兄弟w是黑色的,且w的右孩子时红色的。]
接下来,便是一一删除这些点12 1 9 2 0 11 7 19 4 15 18 5 14 13 10 16 6 3 8 17为例,即,红黑树删除情况全程演示:
各个结点删除与以上的六种情况,一一对应起来,如图:
首先,插入12 1 9 2 0 11 7 19 4 15 18 5 14 13 10 16 6 3 8 17结点后,形成的红黑树为:
然后,以下的20张图,是一一删除这些结点12 1 9 2 0 11 7 19 4 15 18 5 14 13 10 16 6 3 8 17所得到的删除情况的全程演示图:
红黑树的一一删除各结点:12 1 9 2 0 11 7 19 4 15 18 5 14 13 10 16 6 3 8 17的全程演示图完。
参考文献,本人代表作之一:红黑树系列:
全文完。
版权所有。转载本BLOG内任何文章,请以超链接形式注明出处。
否则,一经发现,必定永久谴责+追究法律责任。谢谢,各位。
- 上一篇:十道海量数据处理面试题与十个方法大总结
- 下一篇:红黑树的C++完整实现源码
-
64楼
sql2005vs2005 2013-05-03 18:44发表
-
-
删除部分实在是看不下去了,乱,矛盾。
1,删除12,你找到的那个所谓的当前节点x,到底是多少,是10?如果是10,10那个节点直接涂黑不就好了吗,怎么会对应到“情况1:x的兄弟w是红色的”。
2,再看删除1 的情况,删除1实际上是删除前驱0对吧,那么这里找到的x是什么,是null,好就算null是合理的,并且颜色是双重黑,其兄弟2是黑的,但其子节点不是都黑,怎么对应到“情况2:x的兄弟w是黑色的,且w的俩个孩子都是黑色的。”。
3.删除一个左右节点都不为空的节点,是删除其直接前驱还是直接后继,在删除12的时候是找的直接前驱,删除1的时候,有“可能”也是删除的直接前驱,但删除9你绝对删除的时候直接后继。到底是什么。。。
-
63楼
Licorice_Che 2013-04-09 20:02发表
-
-
删除那里感觉还是有点乱啊~~~在一步一图一代吗那篇文章里面的N我理解的是后来代替被删除的节点填上去的节点。应该没错吧。第一种情况,N为新的根的时候什么都不用做么?直接就是到了N的父节点不是空进入case2了。而且在删除12的时候,取的是左子树最大值,到右面又变成了右子树的最小值好奇怪。并且在删除12的时候貌似不是case2吧,而是直接把新踢上去的节点直接涂黑了啊。
-
Re:
Licorice_Che 2013-04-09 20:27发表
-
- 回复Licorice_Che:而且删除1的时候,在教你透彻了解红黑树的文章里,就是满足:当前节点为黑色,兄弟节点为红色的情况啊(也就是case2),那么需要把父节点染红,兄弟节点染黑,染黑进行相应的旋转啊。可是也没有选择=。=真的已经晕了
-
Re:
Licorice_Che 2013-04-09 20:03发表
-
- 回复Licorice_Che:写错了。删除12的时候把替上去的节点直接涂红就可以了
-
-
62楼
garyzhang2681 2013-03-21 08:53发表
-
-
为什么在删除12的时候,取的是左子树中最大的,
删除1的时候,取的是左子树中最大的,
但是在删除9的时候,取的是右子树中最小的?
-
61楼
LLittleb 2013-03-11 13:54发表
-
-
请楼主大神赐教,最后三幅图我怎么看都不懂。
倒数第三幅,我的理解是:删除节点3,因为3没有右孩子,所以上溯,得8,于是3的位置数据变为8,现在,原来的8节点成为将要被删除的节点。它有右孩子17,所以将8的位置让17这个节点来替代,从而17为当前节点且为根节点。
我只是理解到这里,而且我把整个插入删除过程都做了一遍,就卡在这倒数第三幅图了。
楼主的第四篇:红黑树的C++完整实现源码 我也有疑问,已经发评论提问了。
恳请楼主赐教。
-
60楼
ljn409177477 2013-01-27 17:27发表
-
-
july:在删除操作的时候,按照算法导论以及你之前几篇文章给出的伪代码中,当删除一个节点的时候,寻找其后继一定是在被删除节点的右子树当中,而你给的删除的例子当中,当删除12节点时,是将12的左子树当中的11作为后继节点,而不是右子树中的13,算法导论给的是:y = TREE-MINIMUM(z.right),寻找在比12大的当中最小的关键字结点!
-
Re:
ljn409177477 2013-01-27 17:40发表
-
-
回复ljn409177477:我知道了,当13作为后继节点之后,破坏了红黑树的性质5,这种情况满足:x的兄弟结点w是黑色的,w的左孩子是红色,所以将w的颜色和w.left颜色互换,右旋得到满足红黑树性质的结果!
-
Re:
ljn409177477 2013-01-27 22:19发表
-
-
回复ljn409177477:好像不对,导论中给的是case3的情况时,把x的兄弟节点w进行右旋,所以得到的并非是July给出的删除12节点的结果啊!求解啊!到底是怎样的,为什么和之前将的那几种情况不一样?
-
Re:
v_JULY_v 2013-01-27 22:53发表
-
-
回复ljn409177477:case3 经过颜色调整和对w进行右旋之后,进入了case4(x的兄弟w是黑色的,且w的右孩子时红色的),此时仍需进一步调整。
-
Re:
ljn409177477 2013-01-28 22:24发表
-
- 回复v_JULY_v:case4调整也没有把11调整到子树的根节点,大的方向我理解,就是y被当成z的替代品,其实相当于删除了y节点,如果y是红色,不影响;否则,所有经过y节点的路径上黑节点就少了一个,此时,将y节点的黑色向下推给y的右孩子x节点,x节点相当于变为双重黑色或者红黑色,再往下就太理解怎么让x的另一个附加的黑色一步步向上移动!也就是case1~case4是怎么来的,为什么有着4种情况?
-
-
-
-
-
59楼
duqi_2009 2012-12-01 10:28发表
-
-
楼主你好,请看插入18的那张图,在插入18的时候,已经自顶向下遍历了,在遍历的过程中遇到根节点是一个4-node,那么,是应该当即把它拆分吧,即将1和12节点换成黑色,而楼主你的图是在下一张插入5的时候才进行这已步骤。
-
Re:
v_JULY_v 2012-12-01 11:27发表
-
-
回复duqi_2009:说实话,不是很明白你要表达的意思?
-
Re:
duqi_2009 2012-12-01 22:57发表
-
-
回复v_JULY_v:嗯,我是说,插入18的那张图片中1和12节点应该涂成黑色吧~~
-
Re:
v_JULY_v 2012-12-01 23:08发表
-
-
回复duqi_2009:插入18时,1和12结点原本就是红色的,此时,只要把18代替19作为根结点,而19变为18的右孩子并19着为红色即可,无需再把1和12着为黑色呢。
-
Re:
giftyuui 2012-12-28 17:53发表
-
- 回复v_JULY_v:我理解是这样的,红黑树和234 树是意义对应的,红黑树的插入和删除节点的方法有两种,一种是先从上而下找到插入点,然后从下而上做InsertFixUP,另外一种方法是在自上而下就对节点进行调整,这就是他说的,到最后插入点就不需要在向上做InsertFixUp了,这种方法相对简单点。红黑树的插入和删除节点的方法都是234树对应过来的
-
-
-
-
-
58楼
evermiss 2012-11-19 16:33发表
-
- 这分析 精彩 ,感谢lz,同时为lz的奉献致敬!我很少留言,但是看到楼主这么认真的在做东西 实在忍不住,呵呵
-
57楼
abc645481948 2012-09-27 15:34发表
-
-
首先感谢LZ , 能让我们看到这麽有用的文章.
指出一点小问题: 52楼说的问题我很认同,不知道是不是我们理解的有问题,还是怎么回事.
例如删除节点12时候, 对应的算法导论中 z=12(想要删除的节点), y = 11(正真要删除的节点), x=10(应该就是你说的当前节点). 应该是符合情形1 ,节点10为红色,直接途黑.
真心建议:
LZ 在插入和删除的时候, 最好在旁边注释一下怎样查找当前节点. 只写当前节点,读者应该不知道是哪个,也可能是我太菜了,第一遍没看懂,又回去看了算法导论,才对应了起来.
希望LZ 的算法图解越来越完美.再次感谢LZ.-
Re:
v_JULY_v 2012-09-27 22:52发表
-
- 回复abc645481948:EN,感谢建议,下次一定注意:-)
-
-
56楼
youqika 2012-09-16 17:37发表
-
- 我根据你的插入序列画了一棵2-3-4树,然后一步一步对比这两种树,发现在插入16的时候二者不再有对应关系,不知道是不是我画错了,试了几次都这样。
-
55楼
盖世天才 2012-06-18 17:06发表
-
- 对楼主的辛勤付出感激涕零!!!!!!!
-
54楼
lwjstc 2012-05-30 16:11发表
-
-
没有全看完,其实还有一点,如果删除的节点是一个黑色节点,他没有子节点,然后p为红色,s为黑色,SL为红色,sr为红色.删除以后变成了
SL 右旋转,成了S的父指针,然后 p 左旋转变成, SL(父) p(sl的L) s(SL的SR),按照说明不是说删除的节点没有子节点直接删除么。
-
53楼
lufthansa 2012-05-15 13:41发表
-
-
这些教城从头到尾到底能不能连贯啊?比如第一步删除12这个是教程2的情况1,兄节点为红,双侄为黑,实际操作只是绕自己做了一个右旋然后换色就平衡了,但是按情况1一开始就要绕父节点左旋了,左旋后变成教程2的情况4,又要旋,反正是不可能变成上面图上所示的变换完成的那样了。再往下本来只有变13那路的现在13那路都不知道怎么处理了。有谁能把这一步的过程说下么?就是第一次的删除,删除12这个过程。
-
Re:
abc645481948 2012-09-27 15:39发表
-
-
回复lufthansa:删除节点12 的时候, 现要找到替换12的节点11(即12的中序遍历的前驱节点), 替换12, 找到节点11的字节点10 (即LZ说的当前节点), 10为红色 对应情形1, 染黑即可.
但是我现在还不明白11怎么改变的颜色?-
Re:
ljn409177477 2013-01-27 22:20发表
-
- 回复abc645481948:不是吧,删除12是找其后继节点吧!
-
-
-
52楼
gjt19910817 2012-03-08 14:23发表
-
-
您好。第三步插入节点 9 时好像错了?应该是情形4,你的表格里写的是情形1。刚插入9时,9是1的右孩子,需要进行一次左旋,之后进行一次右旋,最后 9 才会成为树根。所以我觉得是情形4。不知道是不是我理解的不对?
-
Re:
JackyZhengX1990 2012-04-12 16:21发表
-
- 回复gjt19910817:最后一个插入17也应该是情况5!
-
Re:
JackyZhengX1990 2012-04-12 14:43发表
-
- 回复gjt19910817:另外在插入15的时候也不应该是情况2,而应该是情况3,叔叔节点和父节点都是红色!
-
Re:
JackyZhengX1990 2012-04-12 14:04发表
-
- 回复gjt19910817:我同意你的说法!
-
-
51楼
honpey 2012-02-25 22:06发表
-
- 只能说这是神贴了,谢谢July,今后要多多向你学习
-
50楼
yu_lizhu 2011-11-07 11:23发表
-
- 图最好有解释。这样太乱了。
-
49楼
michaelliudl 2011-06-17 14:05发表
-
-
貌似有些同学没有注意到NIL[T],删除节点后调整的参数x可能是NIL[T],这时就容易理解一些了
-
Re:
v_JULY_v 2011-06-18 11:50发表
-
- 回复 michaelliudl:[e03]
-
-
48楼
lizhuo8882743 2011-05-07 17:30发表
-
- [e01]
-
47楼
clingingboy 2011-05-07 17:25发表
-
- 好文:) mark一下
-
46楼
hyclq 2011-04-27 17:28发表
-
- LZ V5
-
45楼
v_JULY_v 2011-04-20 15:04发表
-
- 哈哈,多谢以上 各位朋友。
-
44楼
networkwx 2011-04-20 15:01发表
-
-
LZ就是西游记的孙悟空,神雕侠侣的杨过,射雕英雄传的郭靖,水浒传的西门庆。
呃,最后一个写错了,本来想改的,可是已经点了发表了。
-
43楼
wantuo 2011-04-05 14:05发表
-
- 学习了,楼主辛苦了[e01]
-
42楼
eltonlong 2011-04-05 04:30发表
-
- 博主,你太伟大了,等那天中国一人一票了我选你当主席[e04]
-
41楼
junlas 2011-04-02 13:36发表
-
-
红黑树的应用能简单的描述一下吗?
早就知道红黑树,虽然现在我忘了,但是我一直不知道在实际开发中,哪些场合下能运用到这个数据结构?
-
40楼
gengchenhui 2011-04-01 15:56发表
-
- 算法?
-
39楼
wlw472167267 2011-04-01 11:41发表
-
- 二叉树不错
-
38楼
v_JULY_v 2011-04-01 10:51发表
-
-
to newstudent_never:二叉平衡树的理论在前几篇文章有所提及。至于,你所提到的做一个n路平衡查找树的图解(即B-树),容我日后考虑。:D。
-
Re:
v_JULY_v 2011-06-11 02:08发表
-
- 回复 v_JULY_v:B树已经写了。
-
-
37楼
v_JULY_v 2011-04-01 10:48发表
-
- to newstudent_never:红黑树是一种平衡的二叉搜索树没错,但stl中的map其实本质上也是一颗红黑树,:D。
-
36楼
风吹雪散 2011-04-01 10:37发表
-
- 楼主有这样的做学问的态度,实在是可敬,国内很缺少楼主这样的肯花时间与人分享心得,且用最简单的方法描述问题的 人。建议楼主把平衡二叉树的理论加上,结合这篇文章,做出一个n路平衡查找树的图解出来(即B-树)
-
35楼
风吹雪散 2011-04-01 10:37发表
-
- 之前从来不知道什么叫做红黑树,只知道stl中的map。但是看到你详细的图解,发现是2叉查找树,非平衡的,把查找时间复杂度降低到logN。
-
34楼
v_JULY_v 2011-04-01 10:16发表
-
- to newstudent never,zhenqzhiyujl:谢谢,各位。
-
33楼
野狐 2011-04-01 09:42发表
-
- [e03][e03][e03]
-
32楼
风吹雪散 2011-04-01 09:40发表
-
-
大神,居然能看到这样有水平的 中国人的 算法文章,
还没自信看,只看到了图片,就知道得顶了,我要把你的文章推荐给同事看, 同时署名为 你的网名, 附加网址, 可以吗??
-
31楼
v_JULY_v 2011-04-01 08:11发表
-
- to hzhxxx,qanqiyin,bixuehujin:多谢各位,:D。
-
30楼
bixuehujin 2011-03-31 22:08发表
-
- 先收藏 哈哈!!
-
29楼
努力学飞的鸟 2011-03-31 20:29发表
-
- 学习,收藏[e01]
-
28楼
hzhxxx 2011-03-31 15:51发表
-
-
[e01]
支持楼主的做法
-
27楼
2608 2011-03-31 14:08发表
-
- 例如: 根节点有红黑两个子节点,红色子节点有两个黑色孙子节点,黑色子节点有两个红色孙子节点。如果从根节点删除任意一个子节点,都会导致一次以上的调整,在纸上画出来我知道该怎么调整,但是代码怎么也写不对。
-
26楼
2608 2011-03-31 14:03发表
-
- lz提供的是优化过后的代码,从代码中找不到教科书中对应的各种调整类型,根本不明白为什么要这么做,这也是我最郁闷的地方。
-
25楼
v_JULY_v 2011-03-31 10:15发表
-
- to 2608:由以上4种删除情况,可知,主要是分为:一、x的兄弟w是红色;二、x的兄弟w是黑色的(然后,根据x的兄弟w的孩子的颜色,俩黑,一红一黑,一黑一红,又可分为3种更细的情况)。:D。
-
24楼
v_JULY_v 2011-03-31 10:12发表
-
- to 2608:可知,删除情况主要(并非全部)分为4种:情况1:x的兄弟w是红色的。情况2:x的兄弟w是黑色的,且w的俩个孩子都是黑色的。情况3:x的兄弟w是黑色的,w的左孩子是红色,w的右孩子是黑色。情况4:x的兄弟w是黑色的,且w的右孩子时红色的。
-
23楼
v_JULY_v 2011-03-31 10:12发表
-
- to 2608:具体可参考此红黑树系列第二篇文章:2、红黑树算法的实现与剖析。
-
22楼
v_JULY_v 2011-03-31 10:09发表
-
- to 2608:“书中说的是删除之后如何进行一次调整,但是调整之后有可能rbt并不符合要求,还有可能进行多次调整”,是的,没错。恩,容我日后考虑,:D。
-
21楼
争光 2011-03-31 09:49发表
-
- [e01]
-
20楼
2608 2011-03-31 09:44发表
-
-
不好意思,错别字:
插入的调整我没有以为,
------
插入的调整我没有意见。
-
19楼
2608 2011-03-31 09:43发表
-
-
最后所形成的Rbt总是不对,郁闷了N久之后我发现,书中说的是删除之后如何进行一次调整,但是调整之后有可能rbt并不符合要求,还有可能进行多次调整,如何判断下一次调整类型把我搞得晕头转向。
不知楼主能不能在这方面多下些笔墨。
多谢!
-
18楼
2608 2011-03-31 09:43发表
-
- 红黑树插入删除的各种类型调整我也算是搞清楚了,插入的调整我没有以为。但是删除操作,我发现如果按照书本中的各种调整类型来写代码的话,
-
17楼
v_JULY_v 2011-03-31 07:25发表
-
- to TianCaiBenBen:非常感谢,:D
-
16楼
TianCaiBenBen 2011-03-31 01:02发表
-
-
顶,受益了。
喜欢楼主July对算法精益求精的态度,感谢分享!
-
15楼
v_JULY_v 2011-03-30 20:14发表
-
- to fxmsk,huanq8791235:谢谢,:D。to acerphoenix:承让,谢谢,:D。
-
14楼
acerphoenix 2011-03-30 18:45发表
-
- 太伟大了。先顶后看,冲你这篇文章,我也得整明白红黑树
-
13楼
年少轻狂 2011-03-30 15:39发表
-
- [e01] 谢谢!
-
12楼
fxmsk 2011-03-30 15:37发表
-
- [e01] 谢谢
-
11楼
v_JULY_v 2011-03-30 12:09发表
-
- to grui,ilovehuhu:谢谢,:D
-
10楼
ilovehuhu 2011-03-30 11:33发表
-
- 这个还是真的精华
-
9楼
grui 2011-03-30 10:44发表
-
- [e01][e01]
-
8楼
ZRage 2011-03-30 09:01发表
-
- 支持,收藏,谢谢楼主
-
7楼
v_JULY_v 2011-03-29 19:18发表
-
- to littleliang:恩,收到,:D
-
6楼
v_JULY_v 2011-03-29 19:18发表
-
- 谢谢,所有以上朋友的支持与关注,:D
-
5楼
kingchj 2011-03-29 17:32发表
-
- 一图胜千言!
-
4楼
zenny_chen 2011-03-29 15:57发表
-
-
呵呵,这图给力的
[e03]
-
3楼
littleliang 2011-03-29 14:09发表
-
- 在《C算法》一书中,红黑树是从234树演化而来的,其中讲解了各种操作,很有价值,推荐可以参考。
-
2楼
cougar0709 2011-03-29 11:28发表
-
- mark下,这个得慢慢研究[e03]
-
1楼
v_JULY_v 2011-03-28 18:15发表
-
- ok,整完了。主要是贴图贴的幸苦。至此,红黑树系列到这第五篇文章,基本上可以宣告终结了。小功告成。:D