本科数据结构课程的漏网之鱼-红黑树(上)

在我大学的时候,就曾经从参加面试的学长那里知道红黑树这种数据结构,但是经过我的观察,绝大部分的本科数据结构课程里都没有这部分内容。本文将介绍这种被本科教学体系遗弃,但却常常被工作面试中提到的数据结构,并且为后面的HashMap的内容做铺垫。

定义与性质

首先需要明确的是,红黑树是一棵二叉搜索树,如果不了解二叉搜索树的朋友可以先去了解一下。这里想到了本人在研究生复试的时候被问到什么是二叉搜索树,一时竟然没想起来。

下面是一棵典型的红黑树,我们可以看到这颗红黑树的确是一棵二叉搜索树。

红黑树

一般来说,红黑树具有以下5个性质:

  • 节点由红色和黑色组成

  • 且根节点是黑色

  • 所有的叶子节点都是黑色

  • 根节点到叶子节点的路径上不可能出现两个连续的红色节点

  • 从任一节点出发到每个叶子节点都包含相同数量的黑色节点

红黑树的查找

因为红黑树是一棵二叉搜索树,所以同样具有二叉树的性质:左子树的所有节点都小于当前节点的值,右子树的所有节点都大于当前节点的值。所以,查找节点的算法就很简单了,我们来了解一下查找的流程。

红黑树查找流程

红黑树的插入

介绍红黑树的插入之前,先讲一下红黑树的三种调整方式:变色左旋右旋。变色很好理解,红色变黑色,黑色变红色,主要是左旋和右旋,我在网上找到一张图,很好的解释了左旋和右旋的含义。

左旋与右旋

下面开始进入难点——红黑树的插入。待插入的节点是红色的,因为如果插入的节点是黑色,原来已经平衡的红黑树一定会不平衡,也就一定会进行调整。

情况一:红黑树为空

当红黑树为空的情况下,一目了然,直接插入,然后将节点变成黑色,是不是就符合5个性质了?

情况二:插入节点的父节点是黑色

直接插入节点即可,因为插入的节点是红色的,所以并不影响红黑树的平衡。

情况三:插入节点的父节点和叔叔节点是红色

分析一下这种情形,由于插入节点的父节点和叔叔节点都是红色,所以插入节点的祖父节点一定是黑色,因为不可能出现父子结点均为红色的情形。以前面的那棵红黑树为例,我们试着向里面插入一个值为21的节点。插入后的情形:

情况三的第一次调整

结束了吗?没有。22和21是两个连续的红色节点,需要进行调整。插入节点的父节点和叔叔节点都是红色,因此将这两个节点变黑。

情况三的第二次调整

再仔细观察一下,好像是可以了,但是尝试从根节点到叶子节点,不是每条路径上的黑色节点数都是相同的。再把插入节点的祖父节点25改成红色。

情况三的第三次调整

17和25又是连续的红色节点了,这时把25当作新插入的节点,是不是回到了这种情况开始的状态?这时,给8和17变成黑色就可以满足所有的性质。

情况三的第四次调整

情况四:插入节点的父节点是红色,叔叔节点是黑色或缺少,插入节点是父节点的左子节点,父节点是祖父节点的左子节点

情况四

要在上图插入一个值为1的节点,这时会满足情况四。我们看一下插入这个节点以后的情况。

情况四插入节点后

显然这里不满足不能有两个连续红色节点的性质,我们绕节点13进行右旋。

情况四的第一次调整

接下来对8和13变色,就调整完成了。

情况四的第二次调整

情况五:插入节点的父节点是红色,叔叔节点是黑色或缺少,插入节点是父节点的右子节点,父节点是祖父节点的左子节点

最后一种情况了,我们还是使用情况四的初始状态,往里面插入一个值为10的新节点。

情况五插入节点后

我们对节点8通过一次左旋交换插入节点和其父节点的位置,大家看一下是不是变成了情况四?然后我们按照情况四的方式进行调整即可。

情况五的第一次调整

以上是本文的内容,红黑树的删除操作将在下一篇文章中进行介绍。

猜你喜欢

转载自blog.csdn.net/qq_32273417/article/details/106923441