1.二叉排序树
在学习红黑树之前我们需要了解一下二叉排序树,所谓二叉排序树就是一种特殊的二叉树,首先满足二叉树的性质,然后它存储数据的方式是左边节点比父节点的数据小,而右边节点比父节点数据大。这样当我们查询一个数据时,比如我们要找数据8,先从根节点开始,8比12小所以去左子树找,然后与5比较发现比5大那么去右子节点此时就找到了我们需要的数据8。是不是类似于二分查找呢?只需要O(logn)就能找到数据。
二叉搜索树(二叉排序树,二叉树查找树),他的时间复杂度取决于树的高度,理想情况下为O(logn),但是某些情况下会退化为O(n),比如我们插入的数据为10,9,8,7,6或者是1,2,3,4,5这种情况下二叉排序树将会退化为斜树,相当于一个链表,此时查询的时间复杂度就会变为O(n),如下图所示。
2.红黑树
通过上面的例子我们可以看到即便是二叉排序树十分的优秀,但是在某些情况下二叉排序树的效率会大打折扣,针对这种情况科学家们衍生除了红黑树,只要能满足以下性质就能让二叉排序树到达自平衡。
性质1:每个节点要么是黑色,要么是红色。
性质2:根节点是黑色。
性质3:每个叶子节点(NIL)是黑色。
性质4:相邻节点不能同时为红色,此处的相邻是指父节点和左右任意一个子节点不能同时为红色,从而可以推出性质5
性质5:每个红色节点的两个子节点一定都是黑色。
ps:红黑树是一个黑色平衡的树,但是却不是一个完美平衡的二叉排序树,所谓的完美平衡二叉树就是指平衡因子的绝对值小于等于1,而所谓的平衡因子指的是该节点的左子树层数减去右子树层数的绝对值。黑色平衡是当我们将红黑树中的红色节点全部删除时,此时你会发现都平衡因子为小于1的。红色节点删除之后,有些节点就没有父节点了,它们会直接拿这些节点的祖父节点(父节点的父节点)作为父节点。所以,之前的二叉树就变成了四叉树。
3.红黑树的插入
由于场景1、2、3都比较简单,所以就就没有细讲,可以对照着上图的思维导图进行了解,下面主要介绍的是场景4的,场景4都涉及到左旋,右旋以及变色的处理;首先我们要知道红黑树在插入节点时默认插入的节点为红色,这是因为如果我们默认插入为黑色,那么就会导致不满足性质5,也就是任意节点到每个叶子节点经历的黑色节点一致。
插入场景4.1
插入节点的父为红色且叔叔节点存在,并且叔叔为红色节点。
处理:我们只需要将父节点和叔叔节点变为黑色,同时祖父节点变为红色,如果将祖父节点变为红色后,此时可能出现祖父节点和自己的父节点又不平衡,所以我们还需要继续调整。
注意: 如果祖父节点为根节点,此时不需要改变为红色,如果改变那么就不满足红黑树的性质。