红黑树与普通的平衡二叉树除了颜色到底有啥区别为啥要引入红黑树,它比普通的平衡二叉树究竟好在哪( 三 )


红黑树的黑高则为其根结点的黑高。根据红黑树的性质 3、4,一颗红黑树的黑高 bh \u0026gt;= h/2
Number of nodes from a node to its farthest descendant leaf is no more than twice as the number of nodes to the nearest descendant leaf. 从一个结点到其最远的后代叶结点的顶点数目不会超过从该结点到其最近的叶结点的结点数目的两倍。这句话的意思就是公式 红黑树与普通的平衡二叉树除了颜色到底有啥区别为啥要引入红黑树,它比普通的平衡二叉树究竟好在哪
? ,其中黑高 bh 就表示从根结点 6 到离它最近的叶结点 2 包含的结点数 2 ,而 h 则表示从根结点 6 到其最远的叶结点 9 所包含的结点数目 4 ,显然这一公式是合理的。
红黑树与普通的平衡二叉树除了颜色到底有啥区别为啥要引入红黑树,它比普通的平衡二叉树究竟好在哪

红黑树与普通的平衡二叉树除了颜色到底有啥区别为啥要引入红黑树,它比普通的平衡二叉树究竟好在哪

引理:一棵有n个内部结点的红黑树的高度 h \u0026lt;= 2lg(n+1)。
关于算法导论中的证明,就不再这里显摆了,我们用一种更直观的方式来看一下这个问题。
首先我们将下图中的所有红色结点合并到其黑色父结点
红黑树与普通的平衡二叉树除了颜色到底有啥区别为啥要引入红黑树,它比普通的平衡二叉树究竟好在哪

合并动画演示:
红黑树与普通的平衡二叉树除了颜色到底有啥区别为啥要引入红黑树,它比普通的平衡二叉树究竟好在哪

合并后的结果:
红黑树与普通的平衡二叉树除了颜色到底有啥区别为啥要引入红黑树,它比普通的平衡二叉树究竟好在哪

也就是刚才的合并产生了一颗 2-3-4 树,这棵树中的每一个结点有2、3 或者 4 个孩子结点。而一颗 2-3-4 树的叶结点有着相同的深度 红黑树与普通的平衡二叉树除了颜色到底有啥区别为啥要引入红黑树,它比普通的平衡二叉树究竟好在哪
.
红黑树与普通的平衡二叉树除了颜色到底有啥区别为啥要引入红黑树,它比普通的平衡二叉树究竟好在哪

由于从根结点到任何一个叶结点的路径上至多只有高度 红黑树与普通的平衡二叉树除了颜色到底有啥区别为啥要引入红黑树,它比普通的平衡二叉树究竟好在哪
的一半的红色结点数目,所以可以得到 ? 的结论。
对于一颗有 红黑树与普通的平衡二叉树除了颜色到底有啥区别为啥要引入红黑树,它比普通的平衡二叉树究竟好在哪
个叶子结点的2-3-4 树而言,可以依次得到如下结论:
? 红黑树与普通的平衡二叉树除了颜色到底有啥区别为啥要引入红黑树,它比普通的平衡二叉树究竟好在哪
? 红黑树与普通的平衡二叉树除了颜色到底有啥区别为啥要引入红黑树,它比普通的平衡二叉树究竟好在哪
? 红黑树与普通的平衡二叉树除了颜色到底有啥区别为啥要引入红黑树,它比普通的平衡二叉树究竟好在哪
所以对于一颗有 ? 红黑树与普通的平衡二叉树除了颜色到底有啥区别为啥要引入红黑树,它比普通的平衡二叉树究竟好在哪
个结点的红黑树而言,不论查找、删除、查找和最大值、最小值等等的时间复杂度都是 ? 红黑树与普通的平衡二叉树除了颜色到底有啥区别为啥要引入红黑树,它比普通的平衡二叉树究竟好在哪
.
红黑树有什么应用呢?
大多数自平衡BST(self-balancing BST) 库函数都是用红黑树实现的,比如C++中的map 和 set (或者 Java 中的 TreeSet 和 TreeMap)。红黑树也用于实现 Linux 操作系统的 CPU 调度。完全公平调度(Completely Fair Scheduler)使用的就是红黑树。下图来自于为英文的维基百科(该图为Linux的内核图)。
红黑树与普通的平衡二叉树除了颜色到底有啥区别为啥要引入红黑树,它比普通的平衡二叉树究竟好在哪


推荐阅读