【C++】 ——红黑树的旋转(详细图解+附C++代码)

1、红黑树的概念

  • 红黑树是一棵二叉搜索树
  • 所有的左孩子都小于根结点,右孩子都大于根结点
  • 红黑树是一棵基本平衡的树(左右高度差不超过1)
  • 红黑树最大深度小于等于最小深度的二倍

2、红黑树的性质

性质:
(1)每个节点是红色或者黑色
(2)根结点是黑色
(3)所有叶节点是黑色
(4)红节点的孩子必须是黑节点,所有的叶节点都是空节点
(5)从一个节点到它所有叶子节点的路径中,黑节点的个数是相相同的

其实关于性质三,我们可以推理出:所有从上到下的路径中,不能有两个连续的红节点,但可以有两个连续的黑节点。从红黑树的性质5中,可以推理出“红黑树最大深度小于等于最小深度的2倍”。因为对于任何一个节点来说,比如它到左孩子叶节点共经历了5个黑节点,那么它到右孩子叶节点一定也是经历了5个黑节点,经历5个黑节点能够做到的最大深度是多少呢?因为性质3,不能偶有两个连续的红节点,所以最大深度一定是红黑相间的,就可以做到最大深度为10,所以说“红黑树最大深度小于等于最小深度的二倍

3、红黑树的插入

其实插入的话,我们首先得思考一个问题,你插入的默认颜色是RED还是BLACK?这里我们需要根据性质来思考,如果首先插入的是黑节点,这个可以直接插入,但是就会违背我们的性质5,每条路径黑色节点的数量就会不一样了。调整起来就会比较繁琐,所以插入节点一定要为红色

(1)情况一:插入的cur为红,parent为红,grandparent为黑,uncle存在且为红。

如下图:
在这里插入图片描述
此时我们所做的一个操作就是把parent和uncle的颜色变为黑,grandparent的结点变为红,这样我们就保证了该子树中每条路径中黑色节点数量相同,并且没有连续的红色节点

(2)情况二:cur为红,parent为红,grandparent为黑,uncle不存在或者uncle为黑,那这时候我们就要进行旋转操作(这里面还包括四种情况:到底是进行左单旋还是右单旋)。

当parent为grandparent的左孩子,cur为parent的左孩子则进行右单旋,然后修改颜色;第一种情况uncle不存在,如图:
在这里插入图片描述
第二种情况uncle存在且为黑:
在这里插入图片描述
第三种情况:parent为grandparent的右孩子,cur为parent的右孩子,进行左单旋转。
以下是uncle不存在

在这里插入图片描述
情况四,uncle存在且为黑,如图:
在这里插入图片描述

(3)情况三:cur为红,parent为红,grandparent为黑,uncle存在或者uncle为黑色。进行双旋

如图是uncle存在且为黑色
在这里插入图片描述
所做的处理是进行左右单旋,然后调整颜色:
在这里插入图片描述
第二种形态:
在这里插入图片描述
所做的处理时进行右左单旋
在这里插入图片描述

4、红黑树的代码实现

链接在这里:红黑树C++代码
希望广大网友提出建议,一定虚心采纳!

原创文章 78 获赞 21 访问量 3549

猜你喜欢

转载自blog.csdn.net/Vicky_Cr/article/details/105460774
今日推荐