您的位置:首页 > 理论基础 > 数据结构算法

红黑树详解 原理 史上最强 精华

2016-07-09 15:42 274 查看
未经授权,不得私自转载,否则追究法律责任

联系作者ntxbaby@163.com取得授权

转载请注明作者和出处

网上很多红黑树的讲解都没有分析清楚插入删除各种情况是怎么来的,他们大多把分析图画的很复杂,其实这些情况都是极其简单的,我这里重点推导各种情况是怎么来的,不解释各种情况怎么调整,因为结构很简单调整很容易,且网上很多。红黑树的精髓是明白各种情况是怎么来的,弄清楚这个才是真正掌握红黑树。

五个性质:

1、节点要么红,要么黑

2、根节点为黑

3、NIL(叶节点)为黑,这条没什么卵用

4、红节点的两个子节点为黑

5、从某节点到各叶节点的路径上的黑节点数相等

红黑树必须满足这5个条件,前3个性质基本废话,增删节点后,性质4和性质5可能会破坏,红黑树调整,主要满足这两个条件即可 

1插入

为了尽量满足4和5两个条件,要点是:

插入的节点必须为红色节点,原因:从某节点到各叶节点的路径上的黑节点数目跟原来一样,不会变化,这样一来性质5是满足的,只需要考虑满足性质4即可。

约定:新插入节点为N,父节点为P,叔叔节点为U,祖父节点为G,兄弟节点为S,兄弟节点的左子为SL,兄弟节点的右子为SR

由于插入节点前的原来红黑树必定平衡,只需要讨论,爷爷辈,父辈,子辈 等3辈情况,也就是约定的这些节点情况

我们现在只穷举违反性质4的情况,这才是需要调整的红黑树的情况

P为红色才会违反4,插入N之前原树是平衡的(满足5个性质),G不可能是红,否则违反4

所以需要调整的情况下一定有:N=r, G=b, P=r这3个固定条件

剩下的就只有U及其子孙情况未知

分析1:插入N前,G的左子只有P为红,那么G的右子上不能有黑节点了,所以U要么为红色,要么不存在。那么U为红色时它有没有子节点呢?答案是肯定没有,也就是U无子,假设U要有子,必须是黑子,前面已经说了,G的右子树上不能有黑节点。

结论:U要么红色,要么不存在

分析2:P到底在插入N这个节点前,会不会有子?答案是肯定没有。P为红,p若有子必为黑子,那么p在插入N前,一边为空,黑子数为0,另一边就不能有黑子,所以P再插入N前也无子



请况一:U=r,此时假设p有另外一个节点(还有一个是刚插入的N),另外一个节点必为黑,问题来了,插入N之前,经过p的左右子的黑节点数不一样,故推断p不能有另外一个节点,那么U也不能有子节点,有就必须是黑,G的左右子树上的黑节点数就不会等,

结论:情况一时,必定有P仅有一个子节点N,U无子节点

调整: P和N染黑,G染红,N指向G递归,直到N为根节点,染黑

情况二:U=b(准确表述为U没有),N为P的左子,与二类似,U为nil节点
结论: 情况二  时G没有右子,P没有右子,N为P的左子
调整:P,G颜色交换,G为轴右旋,完

情况三:U=b(准确表述为U没有),N为P的右子,N插入前通过G的右子树的黑节点数位2,那么G到P到P的右子的黑节点数只有一,这种情况只有U为nil节点才说的通

结论: 情况三  时G没有右子,P没有左子,N为P的右子

调整:P节点为轴左旋,变成情况二

2删除

删除节点X后,需要在子树中选择一个节点来顶替X的位置,我们选择X左子树里面最大的节点来顶替,而这个节点一定在树的底部(假设根节点为顶部),这个顶替上来的节点染成X的颜色,这就等价于,只是删除了顶替上来的节点,删除操作移动到了树的底部,删除操作在底部进行,讨论起来容易很多。

这个顶替上来的节点是X左子树里面最大的节点,这个节点有特殊性质,没有右子节点

现在问题变成:删除一个树底部的,没有右子的节点X

如果X是红色,顶替节点N为红色,不用调整,结束

如果X是红色,顶替节点N为黑色,等价于删除树底部的黑色节点,这种情况合并到下面X为黑色情况

如果X是黑色,顶替节点N为红色,N节点染黑,结束

如果X是黑色,顶替节点N为黑色,讨论

只有删除黑色节点,才需要讨论

那么需要调整的情况下,条件有:X为黑色,X无右子

约定删除节点为X,X的父节点为P,X的兄弟节点为S, S的左子为SL, S的右子为SR

根据X的左子情况讨论

情况一:

X有左子,左子必定为红,因为右子为空,根据红黑树性质5,左子上不能有黑节点,所以左子也就不能有子节点

删除X,左子顶替,左子N为红,N染黑,结束

情况二:

X无左子,只能根据S的情况讨论

1

 S=R,S必定有子,且两子都为黑,即SL=B, SR=B。因为X左子树里面最大的节点,X必定是P的右节点,P的右子树黑节点数为1个,左子树上每条路径黑节点树为1, S是红色的,只能是它的两子为黑。SL和SR不会有子节点了,否则整个P的左右子树不平衡

调整:P右旋,变成2-1情况



S=B, S不能再有黑色子节点

2-1 S无节点

调整:S染红,向上递归

2-2 SL为红,无SR

调整:P右旋, SL染黑

2-3 SL和SR都为红

调整:P右旋,SL染黑

情况2-2,2-3可合并为一种情况

2-4 SL没有,SR为红

调整:S左旋,变成情况2-2

附:没有节点跟节点为黑统一成一个意思

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息