关于红黑树的插入和删除

文章是根据算法导论中的内容整理和总结出来的,和算法导论一起食用效果更佳。


1.定义:

定义:红黑树是一棵二叉搜索树。它在每个结点每个结点上添加一个存储位来表示颜色,可以是红色或者黑色。通过对任何一条从根到叶子结点的简单路径上各个结点的颜色进行约束。红黑树保证确保没有一条路径会比其他路径长出两倍,因而近似是平衡的。

2.性质:

性质:
(1)每个结点或者是红色或者是黑色;
(2)根结点是黑色的;
(3)每个叶子结点是黑色的;(算法导论中的设定,叶子结点都是null,null都是黑色的)
(4)如果一个结点的颜色是红色,那么它的两个子结点都是黑色的;
(5)对于每个结点,从该结点到其后代叶子结点的简单路径上,均包含相同数目的黑色结点。


3.插入:

插入操作中,先执行二叉搜索树的插入,然后在调用函数修复这颗红黑树,使其满足红黑树的性质。

修复函数的额不变式是:
a. 结点z是红色的结点;
b.如果z的父结点是根结点,根结点的颜色为黑色;
c.如果有任何的红黑树的性质被破坏,则至多破坏一个,要么是性质2,要么是性质4。如果是性质2被破坏,其原因是因为z的父结点是根结点且红色的。否则是性质4被破坏。在循环之中也可能破坏性质5,这时候就要执行旋转来调节,路径上的黑色结点数(在循环中的条件是,性质4被破坏):
    1.把z的父结点变成黑色,z的父结点的父结点(如果有的话)变成红色;从z的父结点的父结点开始的子树上的黑色结点数目不变。
    2.然后执行旋转,保持z的父结点的父结点的两颗子树的上的黑色结点数目相等。

4.删除

删除操作的一开始的操作和二叉搜索树的删除是很相似的。
先在要删除的结点z的右子树中找到z的后继y,因为y是z的后继,所以肯定没有左孩子。用y替换z结点,y的颜色为z的颜色,因此这个替换不会破坏红黑树的性质。让y的右孩子x替换y的位置,如果y的原来的颜色是黑色,那么这个替换操作就会使x这颗子树上的黑高变小,否则,没有任何影响。

从上面的描述可以看出,删除操作可能破坏的性质是性质5,从任何结点出发,到叶子结点的简单路径,经过的黑色结点数是相同的。

修复删除操作带来的破坏的操作是,在x上面附上已成额外的黑色,使得看起来满足红黑树的性质,然后逐步上调。调整树之间的平衡的手法是让从x.parent.parent开始的子树整个子树的黑色结点数目保持不变。借助x的兄弟结点来调节平衡。
一开始的时候,我们设子树是这样的,a1上的黑高为n。B是要删除的结点,C明显就是要替换B的那个结点。

当将C替换B之后,D结点替换了C结点的位置,重新成为了E的右孩子。
此时,d1,d2 上的黑高为n - 2,a1,a2,c1,e1,e2上的黑高为n。
正如下图所示,E的左子树的黑高为n - 1,而右子树的黑高为n,这是不平衡的,因此需要调整。

根据算法导论中的假设,假设w为x的兄弟结点。每种情况的图在算法导论中也有给出,上面解释的是为什么会失衡:
case1:当w是红色的时候:
    因为x是黑色的,E的左子树的黑高是n(n >= 1),而E的右子树的根结点,也就是w的颜色是红色的,所以,w必定有一个黑色的子结点。把w的颜色和w.parent的颜色交换,变成黑色,执行左旋。并且保持整棵树的 黑高不变。这时候,x的兄弟就变成原w的左孩子。必定是黑色或者为空。变成case2,3,4中的一种。

case2:当x的兄弟w的颜色是黑色,两个孩子都为黑色或者都为空的时候:
      先把x和w的一种黑色去掉,w变成红色,x变成单重黑色的结点,然后在x的父结点上附上已成黑色。如果是从case1变换而来的,x的父结点就必定为红色,附上一层黑色之后,整棵树的黑高不变,父结点有红黑色。让x指向x.p arent循环就会就会终止,并在循环外,将x的颜色变为黑色,维持黑高。

case3:当x的兄弟w的左孩子为黑色,左孩子的颜色有红色,右孩子的颜色为黑色或者为空:
    先把w的颜色和左孩子的颜色交换,然后将w右旋。这样就变成了case4。

case4:但x的兄弟结点是黑色的,左孩子是黑色或者为空,右孩子的颜色是红色:
    附上一张图说明这个情况,因为这个情况将会导致循环终止。假设有a1的黑高为n - 2,黑高的多少不会影响彼此之间的约束关系。
值得注意的是,e1, e2的黑高是n - 2, a1,a2, d1, d2黑高是n - 2。(参考之前的那几幅图,就知道为什么是n - 2了)

变换的时候,把x的父结点(图中为C)的颜色赋值给w结点(图中为E),然后将x的父结点(父结点的颜色不一定是黑色)的颜色置为黑色,w的右孩
子置为黑色。在执行了这些操作之后,可以得出下图:

现在将x上的双重黑色去掉一重,C的做左子树的黑高为n - 1, 右子树的黑高也为n - 1。E的左子树的黑高为n,右子树的黑高为n - 1 + 1 = n。也就是说,性质5已经没有被破坏了,循环可以终止了。但是需要注意的是,如果E是根结点的话,这是不满足性质1的,所以我们要在退出循环的之前把x指向根结点,退出循环后,把x的颜色变成黑色。保证了整棵树的根结点的颜色为黑色。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值