红黑树的构建(插入过程)
在这里插入代码片
基础知识
红黑树本质上是一种二叉查找树,但它在二叉查找树的基础上额外添加了一个标记(颜色),同时具有一定的规则。这些规则使红黑树保证了一种平衡,插入、删除、查找的最坏时间复杂度都为 O(logn)。它的统计性能要好于平衡二叉树(AVL树)。
它具有以下5个性质:
1、节点颜色必须是红色或者黑色
2、根节点是黑色
3、每个叶子节点(NIL节点、空节点)是黑色的
4、每个红色节点的两个子节点都是黑色
5、从任一节点到每个叶子的所有路径都包含数目相同的黑色节点
红黑树中插入结点后,主要有3大种6小种:
- 红色结点作为根节点,涂黑,直接插入。
- 父结点是黑结点,直接插入红色结点。
- 父结点是红色结点,这时候直接插入红色结点,不满足性质4。
这时候就需要根据其叔叔结点是红色还是黑色分别处理。(分为6小种)
1.叔叔结点是红色,那么 就要把父节点和叔叔节点涂成黑色,祖父节点涂成红色(但如果是根节点涂成黑色)。
下面情况的步骤就像是对平衡二叉树插入新值一样,对不平衡的部位进行调整
对最末端不平衡的三个结点,选取中间那个结点作为根结点重新构建二叉树。依次往上进行递归。
[【平衡二叉树的调整】](https://www.bilibili.com/video/BV1T44y1y7Z7?share_source=copy_web&vd_source=6c92134ec8fe8ce51f059eee460ff9bf)
左右支处理情况相同
2.叔叔结点是黑色,父结点位于祖父结点的左分支,插入结点位于父结点的左分支,旋转加变色;插入结点位于父结点的右分支,旋转旋转加变色。
3.叔叔结点是黑色,父结点位于祖父结点的右分支,插入结点位于父结点的右分支,旋转加变色;插入结点位于父结点的左分支,旋转旋转加变色。
构建和插入案例见如下链接处,例子极好
https://www.cnblogs.com/zh718594493/p/12232297.htm