红黑树的查找、插入、删除

AVL树的插入操作时间复杂度是O(1),删除操作时间复杂度是O(logN)。红黑树的引入是对AVL树的一种性能上的提升,使删除操作的时间复杂度也可在常数时间内完成。

外部节点

与B树一样,在末端节点处增加外部节点。可以说,红黑树在一定意义上是满二叉树。

规则:

(1) 树根结点必须是黑色
(2) 外部节点必须是黑色
(3) 其余节点若为红色,该节点子和父必是黑色
(4) 外部节点到根结点的途中所经过的黑色节点数目相等

提升变换

这是红黑树所特有的一种辅助我们理解的方法。具体做法就是将红色节点上移一层与其父节点平层,在形式上要满足中序遍历(看的方便)。
经过提升变换后,所有末端节点(不论黑的、红的、还是提升上来的)都处在同一层上,相应的,所有的外部节点也都在同一层上。

红黑树与B树的关系

经过提升变换后,各红节点与其父亲等高。于是每棵红黑树,都对应于一棵(2,4)树。将黑节点与其红孩子合并为超级节点。

查找:

时间复杂度O(1)

静态操作
直接调用BST查找接口即可

插入:

时间复杂度O(1)

由于染色和重构都是常数时间的操作。因此只需要统计操作次数。每一次插入最多O(logn)。
最多一次3+4重构以及O(logn)次节点染色。分摊后仅O(1)。

如果需要插入目标关键码e,则首先调用search(e),将目标关键码插入到树中后,必然生成一个末端节点x=insert(e),此时如果不是x不是根节点,择其父亲p必然存在。将x染红,此时满足(1)(2)(4),但是(3)不一定,因此我们需要观察父亲p的颜色。如果p为红色,那么此时x和p同时为红色,这就会引发双红缺陷

此时需要观察x的祖父g,此时g必然存在且为黑色,不然父亲p不可能为红色。还需要观察祖父g的另一个孩子节点u(x的叔父),由于u的颜色无法确定,因此下面我们需要根据节点u的颜色分别对双红缺陷进行处理。

RR-1-> u为黑

此时x、p、g四个孩子都是黑色。此时做一次提升变换,x、p与g结合成一个超级节点。插入红关键码后,使得原黑关键码不再居中(RRB或BRR)。此时的问题很明显,中间的节点颜色不是黑色的,因此改动很简单,在B树中进行染色即可,将中间节点置为黑色,两侧节点置为红色即可。对应在红黑树中,就是进行3+4重构以及染色

例如:zig-zig,x、p、g可以直接进行3+4重构,并将p为黑,x、g为红。

只需要修复一次即可修复全局。

RR-2> u为红

此时做一次提升变换,x、p、g、u结合成一个超级节点。在B树中,这属于发生了上溢的情况,因此需要进行分裂操作。将分裂出的节点移入上层,因此分裂的节点需要置为红色。剩下的节点按具体情况变色。对应到红黑树中,不需要进行重构,染色即可。当然,分裂节点加入新的一层后,如果左右兄弟有为红色的,可能会再次引发双红缺陷,逐层上升,最多抵达根节点结束。只需要再次调用该算法即可。

例如:zig-zag,只需要将g置为红色,将p、u置为黑色。

情况旋转次数染色次数此后
u为黑1~22调整随即完成
u为红03可能再次双红,但必上升两层

删除

时间复杂度O(1)

由于染色和重构都是常数时间的操作。因此只需要统计操作次数。每一次删除最多O(logn)。
最多一次3+4重构、一次单旋、以及O(logn)次节点染色。

如果需要删除目标关键码e,则首先调用search(e),如果删除该节点,则该位置由其孩子r代替,这个操作为r=removeAt(x , _hot)。如果x和r二者之一为红,那么只需将r置为黑色,删除随即结束。如果x和r都为黑色,那么就会引发双黑缺陷

如果x和r都为黑色,在对应的B树中,x删除后会发生下溢。此时需要观察x的原父亲p以及r的兄弟s。

BB-1 ->s为黑,且至少有一个红孩子t

此时的下溢需要进行旋转操作。S升到上一层p的位置,p下来作为右侧超级节点。对应到红黑树就是做一次3+4重构,并进行染色

例如:t、s、p为zig-zig,此时只需要将t和p置为黑色,p继承原p的颜色。
只需要修复一次即可修复全局

BB-2R ->s为黑,且两个孩子均为黑,p为红

此时的下溢需要进行合并操作。P下移一层和s融合为一个超级节点。对应到红黑树就是进行染色。由于一开始p是红色节点,因此其所在的超级节点中p必有一个黑色兄弟且仅有一个,因此不会继续发生下下溢。

例如:s、p为zig,此时只需要将s置为红色,p置为黑色。
只需要修复一次即可修复全局

BB-2B ->s为黑,且两个孩子均为黑,p为黑

此时的下溢需要进行合并操作。P下移一层和s融合为一个超级节点。对应到红黑树就是进行染色。但是由于一开始p是黑色节点,p的两个孩子x和s都为黑色,因此其所在的超级节点中必然会继续发生下溢。

例如:s、p为zig,此时只需要将s置为红色,p置为黑色。

BB-3 ->s为红,且两个孩子均为黑

此时上移一层s和p融合为一个超级节点,此时这个超级节点的某个孩子会发生下溢。。在B树中将s和p互换颜色,此时对应红黑树中需要围绕节点p做一次zig或zag,同时反转p和s的颜色。此时会引发p的孩子的双黑缺陷。此时由于p为红,p的孩子均为黑,因此只会引发BB->1、BB-2R。再经一轮调整即可结束。

情况旋转次数染色次数此后
BB-1 黑s有红子t1~23调整随即完成
BB-2R 黑s无红子,p红02调整随即完成
BB-2B 黑s无红子,p黑01必然再次双黑,但将上升一层
BB-3 红s12转为BB-1或BB-2R
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值