234树
人们知道平衡二叉树对计算资源的损耗太大,因此创造了红黑树,红黑树来源于多叉树中的2 3 4树,也叫4阶B树。
什么是234树
一个节点最多分出四个叉的树叫做234树,也叫4阶B树,构成234树的核心就是它的节点。234树的节点由单节点、双节点和三节点这三种节点组成,单节点可以分出两个叉(左右各一个),双节点可以分出三个叉(左右中各一个),三节点可以分出四个叉(左右各一个,中间两个),因此叫做234树。
234树的构建
二叉树的构建是从上到下的,B树的构建从下向上构建的,但是节点内部同样要求有序。
示例
给定一组数据,将其构建出来
分析:
(1)15插入,作为单独的节点;
(2)27插入,和15组合,由二节点生成了三节点(该过程成为升元);
(3)41插入,和15、27有序组合,升元成为四节点;
(4)20插入,此时要保证有序,20应该插入到15、27中间,但是此时就变成了四节点,这不存在于234树中,因此就只能向上构建父节点,将中间节点27向上挤出去,20插入在15的右边,此时从27分出两个叉,左边是小于27的,右边是大于27的。
(5)10插入,放在15左边;
(6)38插入,放在41左边;
(7)13插入,应该插入10和15中间,但是10-15-20已经三节点了,于是将15挤出去与27组合升元。
(8)16插入,放在20的左边;
(9)22插入,放在20的右边;
(10)19插入,应该放在16和20中间,但是节点已满,因此只能把20挤出去放在15和27中间,16和19结合,15-20-27中间的左边分叉指向16-19,中右分叉指向22;
(11)40插入,放在38和41的中间;
(12)37插入,放在38的左边,但是节点已满,因此只能把中间的40挤出去,此时15-20-27节点已满,因此只能把中间的20再挤上去,然后27、40结合,分别指向22、37-38、41,结束。
构建结果:
红黑树
通过234树构建红黑树
在234树中的单节点只能转换成一个黑色节点;
双节点可以转换成黑色和红色两种节点,并且可以自由选择红黑关系的左右;
三节点则是只能转换成由一个黑节点指向两个红节点。
示例
尝试通过下图中的234树构建红黑树:
分析:
(1)将单节点的20、15都转换为黑节点并相连;
(2)15的左子树是双节点10-13,我们选择红节点放在黑节点的左边,即13→10;
(3)15的右子树是双节点16-19,我们选择红节点放在黑节点的左边,即19→16;
(4)20的右子树是双节点27-40,我们选择红节点放在黑节点的左边,即38→27;
(5)27的左子树是单节点22,变为黑节点;
(6)27的右子树是单节点37,变为黑节点;
(7)38的右子树是三节点40-41-42,我们将中间节点41变为黑节点,左右分别指向两个红节点40、41,结束。
构建结果:
红黑树的特点
1. 每个节点不是红色就是黑色的;
2. 红黑树的根节点一定是黑色的;
原因:红黑树在构建的过程中是由234树构建的,234树的每个节点在构建红黑树的过程中都是由黑色节点打头的,因此红黑树的根节点一定是黑色的。
3. 红黑树的叶子节点一定是黑色的;
注:红黑树的叶子节点并不是我们真实构建出来的节点,而是有专门属于自己的节点。
4. 如果一个节点是红色的,那么它的子节点一定是黑色的;
原因:因为在红黑树构建过程中,红色节点一定只出现在第二层,且当前节点最多两层,下一层必定是黑色打头的,同时叶子节点也一定是黑色的。
5. 从根节点到该节点所有的叶子节点路径上包含相同数目的黑色节点。
原因:在构建过程中我们构建了一个234树,234树从下到上构建的,也就导致234树所有的叶子节点都在同一层级上,也就意味着层高是相同的,同时我们在构建过程中,每一层都会最多表现一个黑色节点。
为什么红黑树叫最优二叉树
1. 相对稳定,且时间复杂度在O(log n);
红黑树稳定的原因:红黑树要求从根节点到任意一个叶子节点所走过的最长路径不会超过最短路径的二倍。
路径长度关系的原因:当我们找一个红黑树中最短的路径时,我们会得到一个全是黑色节点的路径,而在构建的过程中,原234树的所有节点层高相同,在这种情况下构建出来的最长的路径,其红色节点又会受到特点(4)的约束,因此只会是一个红黑交替,总长度又不会超过最短路径的路径。
时间复杂度稳定在O(log n)的原因:二叉树的时间复杂度本质上都接近O(log n),只是除了红黑树以外的二叉树时间复杂度都不稳定,有的时候可能会高于O(logn),甚至到O(n)的程度,而稳定的二叉树就能保持时间复杂度接近O(log n)。
2. 构建相对于平衡二叉树不会消耗太多的计算机的计算资源。
原因:红黑树插入一个新节点是通过变色和旋转来体现的,但它的变色和旋转是相对简单的。
注:构建完成的红黑树新插入的节点一定是红色的节点,少数情况下会转变成黑色的节点(如插入两个节点中间的数),在插入后不会大幅度影响整个树原本的形状,除非是插入三节点的情况。