一文读懂复杂的树结构——红黑树

专栏目录(数据结构与算法解析):https://blog.csdn.net/qq_40344524/article/details/107785323

红黑树

红黑树定义和性质

红黑树是一种含有红黑结点并能自平衡的二叉查找树。它必须满足下面性质:

性质1:每个节点要么是黑色,要么是红色。
性质2:根节点是黑色。
性质3:每个叶子节点(NIL)是黑色。
性质4:每个红色结点的两个子结点一定都是黑色。
性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。

从性质5又可以推出:

性质6:如果一个结点存在黑子结点,那么该结点肯定有两个子结点

红黑树的结构

红黑树的结构如下图所示
在这里插入图片描述

红黑树并不是一个完美平衡二叉查找树,从上图可以看到,根结点P的左子树显然比右子树高,但左子树和右子树的黑结点的层数是相等的,也即任意一个结点到到每个叶子结点的路径都包含数量相同的黑结点(性质5)。所以我们叫红黑树这种平衡为黑色完美平衡。


结合上述红黑树的结构图对红黑树性质进行分析我们可以发现红黑树从根结点到叶子结点的最长路径不会超过最短路径的两倍,而且由于对红黑树的限制条件比较复杂所以在对红黑树进行操作时要想保证树的性质不变那自平衡特性是必不可少的。


当插入或者删除结点时,红黑树的特性有可能被打破,这是就应该做一些操作,来维持红黑树规则,通常可进行的操作包括变色和旋转(左旋转和右旋转),接下来分别对红黑树的插入和删除操作进行介绍。

插入

红黑树中插入元素会有多种情况,下面讲解其中有代表性的两例

(1)不破坏原有结构

当结点的两个子结点都是NIL叶子结点时,给该结点插入一个子结点时原有结构不会发生改动,在之前的红黑树的基础上插入20,过程如下:
在这里插入图片描述

(2)破坏原有结构

插入操作破坏原有结构的情况很多,下面通过图示对其中较为典型的一类进行讲解。

在上面的结构中继续插入元素22,过程如下:
在这里插入图片描述


我们可以发现红色结点20的子结点22是红色结点(不符合性质4),所以需要将结点20变色
在这里插入图片描述


结点22变色后我们可以发现根结点到20结点下的叶子结点的路径中包含的黑色结点比到其他叶子结点经过的黑色结点多,所以我们可以想到要将结点20的父结点23也进行变色
在这里插入图片描述


此时结点25和结点23有出现两个连续红色结点,所以可以对结点25进行变色
在这里插入图片描述


现在我们可以发现根结点到其右子树的叶子结点所经过的黑色结点比左子树多,但是因为根结点必须是黑色所以我们已经无法进行向上执行变色操作了,因此我们需要用到旋转操作,将结点23旋转作为根结点的右子结点,将结点25旋转到原先右子结点的位置
在这里插入图片描述


如上图所示,根结点到结点31的子结点经过的合适黑色结点比到其他叶子结点经过的黑色结点多,因此我们需要将结点31进行变色
在这里插入图片描述

到此时结点插入这个过程就结束了,我们可以发现经过一系列的操作插入元素后还可以维持树结构是一棵完整的红黑树,红黑树的插入还有很多种情况,操作思路与上述过程基本一致,现在就不对其进行详细讲解了。


接下来我们来看一下红黑树中结点的删除。

删除

删除操作和插入操作互为逆过程,删除操作的思路和操作的目的与插入操作相同,也要保持树的黑色平衡,接下来举例进行讲解。

(1)删除无子结点的结点

在上图红黑树中删除结点22,该结点没有字子结点,而且由于该结点为红色不会对路径中的黑色结点数量产生影响,因此我们可以直接将此结点删除,在结点位置用NIL填充,删除过程如下:
在这里插入图片描述

(2)删除有两个子结点的结点

在上面红黑树中删除结点23,将结点23删除后23的子树与根断开了,所以我们需要为其重新建立连接,将原结点23的右子树中的最小值提到结点23的位置,并将其他结点位置进行调整,若有不符合红黑树性质的结点则对其进行变色或旋转操作(与插入时思路一致),最终结构如下:
在这里插入图片描述


红黑树中结点删除的情况还有很多,操作思路和操作过程与上述基本一致,在这里就不进行详解了。

总结

红黑树的重点和难点在于插入和删除的操作,在对红黑树进行操作时最重要的就是保持黑色自平衡,基本思路是要保证满足红黑树得到所有性质,基本操作是变色和旋转,只要这些基本内容掌握好了无论遇到什么样的情况都可以迎刃而解。

红黑树就先讲到这里,下一节我们学习树结构中的一个特殊的存在——堆。


以上是我的一些粗浅的见解,有表述不当的地方欢迎指正,谢谢!


表述能力有限,部分内容讲解的不到位,有需要可评论或私信,看到必回…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书山客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值