《算法导论》一书提到了红黑树。先一股脑给出红黑树的5个性质:
1. 每个结点或者是红色的,或者是黑色的。
2. 根结点是黑色的。
3. 每个NIL结点是黑色的。原《算法导论》中的描述有些混乱。红黑树叶节点可以是黑的也可以是红色的。严格讲是NIL节点是黑色的。这个NIL节点是红黑树额外引入的结点,在计算黑高时NIL结点也会被计算在内。NIL结点指的是叶结点空的左右子结点延伸出来的的结点,也包括父结点空的父指针衍生出的结点(实际上就是树根的父结点),因此NIL结点是虚构出来为了更好描述红黑树的。
4. 如果一个结点是红色的,则它的两个子结点都是黑色的。(这保证了:从根到叶节点(不包括根节点)的任何一条路径上都至少有一半的节点是黑色的。)
5. 对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点。
为了加深理解,下面给出两个不是红黑树的二叉树:
红黑树中专门虚设了一种结点——NIL结点。分析问题是要强行在叶结点上添上左右子NIL结点。《算法导论》中比较混乱,称添加上的虚设的NIL结点为叶节点,我个人认为这样子会实际叶节点产生混乱,干脆就将这些虚添的称为NIL结点。上面两个图给出了两个不是红黑树的例子,便于加强对红黑树的理解,因为正因为有了性质5才会有后面的引理13.1。(注意数黑高的时候是不包括根结点,但是要包括NIL结点)。
看过二叉搜索树的朋友肯定知道,在二叉搜索树里,个子越小(二叉树高度越矮)意味着搜索速度越快,也越优秀。 红黑树之所以被提出,就是为了将二叉树变得尽量平衡(尽量平衡也就是尽量降低二叉树的高度)。我们知道二叉树最平衡的情况肯定是层数最低的情形,按照二叉树的性质有n个节点的二叉树高度k(n)肯定不低于(这里2是log的底),即包含n个节点的二叉树高度k(n)一定满足:
这里2是log的底,这个性质很容易查到并证明,大家可以百度,可以参考下面的文章:
http://www.cnblogs.com/skywang12345/p/3576328.html
这是二叉树树高的下限,也就是结点数目n给定的条件下,你要创建一颗二叉树,不管你怎么创建,它的个子总是会高于某个值,这好比是人类要生娃,生出来的娃长大后的高度总会高于一个数! 红黑树也是二叉树,因此它肯定也满足这个性质。
因此,结点数目为n的二叉树的高度总是下面这些整数之一:
,
, ..., n
上面这个排列,也就是从最平衡(优秀)到最不平衡(优秀)的排列。
长得最高(最不优秀,即最不平衡)的那个二叉树肯定是一条链连到底的那个(更严格的讲就是树度数为1的二叉树),高度当然就是n。
现在,红黑树来了,它有它自己的基因(性质就是它的基因),它的基因冥冥之中已经决定了它不会长的太高。也正因为它不会太高,它才有存在的意义。这就好比是做人,普通点低调点有时候反而是一种优势,太优秀(搜索效率最高,最平衡的二叉树)的容易英年早逝(创建太难),太差劲了(太高)了又天天被鄙视(效率低),不高不矮的红黑树恰好!!!红黑树好比是普通人家的娃,更容易养活,更实在。
按照红黑树的性质建立的二叉树高度是不会太高的,因为红黑树有个引理:
引理13.1 一颗有n个内部节点的红黑树的高度至多为, 这里2是log的底。
(这个公式可以在《算法导论》里查到)。这个引理也就是告诉作为一颗红黑树是有上限的,也就是说它再差(高)也差(高)不到哪里去,这又是普通二叉树所没有的性质。
因此,我们可以知道这么一个结论,就是红黑树的高度k(n)有个范围(2是log的底):
所以,在《算法导论》中提到有这么一句话:红黑树确保没有一条路径会比其他路径长出2倍,因而近似于平衡的。
上面的公式就说明了这句话的含义。
至于13.1这个引理是怎么证明出来的,《算法导论》中有说明。
参考: