红黑树可不可以全为黑结点?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/guorong520/article/details/81292585

答案肯定是不可以。

1.概念:
  红黑树是一颗近似平衡的二叉搜索树,其性能要比BST好太多,但是没有AVL那么高度平衡,不追求完全平衡,其插入最多需要两次旋转,删除最多需要三次旋转,操作时间复杂度相当于AVL的O(logN),没有AVL那么复杂,在实际应用中,其性能要优于AVL树。
(1)节点是红色或黑色。
(2)根节点是黑色。
(3)每个叶节点(NIL节点,空节点)是黑色的。
(4)每个红色节点的两个子节点都是黑色。(不能有两个连续的红色节点)
(5)从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
2.如果全为黑结点?
当有一颗红黑满二叉树结点都为黑色结点时,此时添加一个黑色结点,不满足(5)特性,但是就算经过旋转,也无法满足(5)特性,大家都是黑色,变不了红黑树。
3.其最长路径长度不会超过最短路径长度。
如下图一颗红黑树,每条路径上的黑色结点都是3个,那么最短路径的长度为2。当黑红结点相间的时候(不能连续为红),此时相当于是最长路径,三个黑结点中间插两个红结点,最长路径的长度为4,所以根据特性,得出结论。

4.性能
(1) 查找代价:
由于红黑树的性质(最长路径长度不超过最短路径长度的2倍),可以说明红黑树虽然不像AVL一样是严格平衡的,但平衡性能还是要比BST要好。其查找代价基本维持在O(logN)左右,但在最差情况下(最长路径是最短路径的2倍少1),比AVL要略逊色一点。
(2) 插入代价:
RBT插入结点时,需要旋转操作和变色操作。但由于只需要保证RBT基本平衡就可以了。因此插入结点最多只需要2次旋转,这一点和AVL的插入操作一样。虽然变色操作需要O(logN),但是变色操作十分简单,代价很小。
(3) 删除代价:
RBT的删除操作代价要比AVL要好的多,删除一个结点最多只需要3次旋转操作。
5.应用
Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虚拟内存的管理,都是通过红黑树去实现的。

猜你喜欢

转载自blog.csdn.net/guorong520/article/details/81292585