平衡二叉搜索树 - 红黑树

1 意义

  其他平衡二叉树,如AVL、B树等,经过某次动态操作,可能导致全树整体拓扑结构的大幅度变化。在某些场合不适用,如保存快照时,那能不能保证每次动态操作后,仅改变局部拓扑结构,对整体没有太大影响呢?
  答案是可以的,由此产生了红黑树。

2 定义

  红黑树是由红、黑两色节点组成的二叉搜索树,且需要满足以下限制条件:

  1. 树根始终为黑色
  2. 外部节点均为黑色
  3. 其余节点若为红色,则其孩子节点必为黑色
  4. 从任一外部节点到根节点的沿途,黑节点的数目相等

  红黑树本质上是一颗4阶B树,它将B树的形和二叉树的身完美的结合了。我们可以将红色的节点往上移到父节点统一高度,就成了一颗B树,由于条件三的原因,黑节点最多两个子节点是红色的,所以转换后的B树的阶次是4阶。
在这里插入图片描述

3 平衡性

  由B树的高度h<log2(n+1),根据红黑树没有相邻红节点,可以得出红黑树高度H<2h<2log2(n+1)。也就是说,尽管红黑树不能如完成树那样可以做到理想平衡,也不如AVL树那样做到较严格的适度平衡,但其高度仍控制在最小高度的两倍以内,从渐进意义上看高度H仍是O(logn),依然保证了适度平衡一一这正是红黑树可高效率支持各种操作的基础。

4 查找

        红黑树的查找策略与常规二叉搜素一致

5 插入

5.1 插入策略

  调用查找接口,在查找终止的位置x处创建节点,并随即将其染成红色(除非此时全树仅含一个节点)。现在,对照红黑树的四项条件,唯有(3)未必满足,即此时x的父亲也为红色。
  因新节点的引入,而导致父子节点同为红色的情况,称作双红缺陷。“双红缺陷”也分两种情况:

情况一:u为黑。此时x的兄弟、两个孩子的黑高度,均与u相等,只需按照关键码大小,重新组合,两个孩子为红节点。
在这里插入图片描述
情况二:u为红。从B树的角度来看,则是关键码数超出,需要分裂上溢。将g变红上溢,p、u变黑分裂即可。
在这里插入图片描述
  经过如此调整之后局部子树的黑高度复原,然而,子树根节点g转为红色之后,有可能在更高层再次引发双红现象,所以需要迭代调整直至不再上溢。特别地,若最后一步迭代之后导致原树根的分裂,并由g独立地构成新的树根节点时,则应遵循红黑树条件(1),的要求,强行将其转为黑色一一如此,全树的黑高度随即增加一层。

5.2 插入效率

情况旋转染色
u为黑1~22
u为红03x(x<logn)

  对于“双红缺陷”的修复,第一种情况只需O(1)时间,第二种情况可能会一直上溢到根,但最多也不过O(logn)次,故总体累计耗时不过O(logn)

6 删除

6.1 删除策略

  红黑树删除策略与常规策略一致,则待删除节点x无左孩子,若此时x为红或者x的右孩子存在且为红,只需将右孩子替换r并染黑即可完成删除。
在这里插入图片描述
  若待删除节点x且右孩子r都是黑时,这种缺陷称为双黑缺陷,从B树的角度来看就是关键码数不够,需要下溢。此时有四种情况。
情况一:兄弟s为黑,且存在一个红孩子t。此时只要按关键码大小重构,且t染黑。从B树的角度来看,是兄弟关键码数充足,借了一个关键码,进行1~2次旋转操作。
在这里插入图片描述
情况二:兄弟s为黑,且无红孩子,父亲p为红。只需将p、s互换色即可。从B树的角度来看,兄弟关键码数不够,需要p下溢合并。
在这里插入图片描述
情况三:兄弟s及其孩子都为黑,父亲p也为黑。将s染红,导致p下溢,相当于删除了节点的位置在p,继而再次引发双黑缺陷,需要重新判断情况,最坏情况可能一直延伸到根节点,但次数不过logn次。
在这里插入图片描述
情况四:红为s,其余均为黑。需要进行一次选择操作,将s上升,且s、p互换染色,在B树的角度来看,此时并未发生什么变化,其目的是为了即将要进行的下溢操作。经过旋转换色之后,此时情况来到了情况一或情况二,不会变到情况三,所以该情况是复杂度O(1)
在这里插入图片描述

6.2 删除效率

情况旋转染色单轮修正之后
情况一1~23结束
情况二02结束
情况三01重新双黑缺陷
情况四12转到情况一或二

  由上图可见,情况一、二、四都可以在O(1)时间内完成,而情况三最多不过O(logn)次。即便计入此前的关键码查找和摘除操作,红黑树的节点删除操作总是可在O(logn)时间内完成

该文插图均来自邓俊辉老师的《数据结构与算法》

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值