红黑树
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++代码
希望广大网友提出建议,一定虚心采纳!