红黑树知识总结

简介

红黑树(Red Black Tree) 是一种自平衡二叉查找树,所有数据块都存储在节点中,在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能,它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。

红黑树的性质

性质一:节点是红色或者是黑色
性质二:根节点是黑色
性质三:每个叶节点(NIL或空节点)是黑色
性质四:每个红色节点的两个子节点都是黑色的(也就是说不存在两个连续的红色节点)
性质五:从根节点到每一个NIL节点的路径中,都包含了相同数量的黑色节点

这些性质的约束,使一棵红黑树从根到叶子的最长的可能路径不多于最短的可能路径的两倍长,从而使这棵树大致是平衡的,因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树(二叉查找树最坏的情况所有元素可能位于一条直线,高度比元素少1,这种情况下树的性能急剧下降)。

平衡操作

为了使一棵红黑树在插入和删除元素时能够继续保持平衡,有变色旋转两种操作,其中旋转又分为旋转和旋转。

变色: 顾名思义,就是将节点的红色与黑色进行变换。

右旋转: 将当前节点向右旋转,其左子节点移动到当前节点位置,左子节点的右子节点,变更为当前节点的左子节点。

左旋转: 与右旋转一致,只是方向相反。

右旋转示意图:

在这里插入图片描述

左旋转示意图:

在这里插入图片描述

红黑树的插入

本章节参考文章:https://zhuanlan.zhihu.com/p/57041683

说明: x为当前处理节点,p为x的父节点,pb为父节点的兄弟节点,pp为祖父节点

分类描述处理方式说明
1pb为红p置黑,pb置黑,pp置红,x指向pp,继续处理pp置红,则可能违法性质四,所以需要继续判断
2pb为黑,x、p、pp不在一条直线p左旋,x指向p,继续处理旋转后使其在一条直线,转化为情况3
3pb为黑,x、p、pp在一条直线p置黑,pp置红,pp左旋已平衡,结束
4pb为nil,p为根节点且为红p置黑已平衡,结束

解析:

注意:以下解析以从p节点为pp节点左支为例

  1. 新插入的节点x为红色,因为插入红色节点相对而言容易调整;
  2. 如果插入一个红色新节点x后,其父节点p是黑色,则不用左调整,已经平衡,所以我们要处理的主要是插入后其父节点p是红色的情况;
  3. 插入一个红色新节点x后,其父节点p也是红色,则违法了性质四,我们需要将其中一个变为黑色,我们将p置为黑色,但这样一来,祖父节点pp的左支就会多出一个黑色,要想办法减少pp左支的黑色节点,那么可以将pp置为红色(p为红色,则pp必为黑色),但是pp置为红色后pp的右支又会少一个黑色,所以需要把pp右支的黑色加上来,有两个办法:
    1. 若pb为红色,则将pb置为黑色即可,但pp置为红色可能有两个连续的红色节点,违反性质四,所以需要将x指向pp继续向上判断;
    2. 若pb是黑色,那么只能右旋pp,让p移动到pp的位置,从而左支增加一个黑色,但是想要通过右旋达到目的,那么x、p、pp必须是在一条直线上,否则右旋后x会成为pp的左子节点,从而出现两个连续红色,所以如果x、p、pp不是在一条直线上,可以先将p左旋,然后x指向p,继续判断处理,此时x、p、pp已经位于一条直线,可以采用我们前面说的处理方式进行处理。

红黑树的删除

该章节请参阅 https://www.cnblogs.com/tongy0/p/5460623.html
这位大侠总结得非常好,后文只做一些辅助说明方便理解

寻找继承者

需要注意的是,文中所说的D节点,其实是寻找出的继承者节点,而非一开始我们想要删除的节点,这点可以参考二叉查找树的删除操作。

了解红黑树的删除,首先需要了解下寻找继承者,因为一个节点被删除,它可能有子节点,它的位置不方便调整,所以我需要可以寻找一个合适的继承者,将继承者的值赋值给被删除的节点,然后实际将继承者删除。

红黑树寻找继承者的规则是,被删除节点右边最小的节点是继承者,找到后将继承者的值赋给被删除的节点,然后实际将继承者删除,那么可以知道,实际被删除的节点总是位于这棵树的最后一层或倒数第二层(可以推论出此时该节点仅有右子节点,且为红色)。

情况罗列

文中总结了很多种情况,稍微有些凌乱,我在下面对文中的各种情况进行一个层次罗列,方便理解,各个节点的指代仍然采用原文种的指代术语

D为红色
D为黑色
	DR不为nil
	DR为nil
		S为红色
		S为黑色
			SL为红色,SR颜色任意(其实可以推导出,此时S的子节点要么为红色要么为nil)
			SR为红色,SL颜色任意(同上)
			SL、SR均为黑色,P为红色(由上可知此时SL与SR均为nil)
			SL、SR均为黑色,P为黑色(由上可知此时SL与SR均为nil)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值