红黑树

《算法导论》一书提到了红黑树。先一股脑给出红黑树的5个性质:

1. 每个结点或者是红色的,或者是黑色的。

2. 根结点是黑色的。

3. 每个NIL结点是黑色的。原《算法导论》中的描述有些混乱。红黑树叶节点可以是黑的也可以是红色的。严格讲是NIL节点是黑色的。这个NIL节点是红黑树额外引入的结点,在计算黑高时NIL结点也会被计算在内。NIL结点指的是叶结点空的左右子结点延伸出来的的结点,也包括父结点空的父指针衍生出的结点(实际上就是树根的父结点),因此NIL结点是虚构出来为了更好描述红黑树的。

4. 如果一个结点是红色的,则它的两个子结点都是黑色的。(这保证了:从根到叶节点(不包括根节点)的任何一条路径上都至少有一半的节点是黑色的。)

5. 对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点。

 

为了加深理解,下面给出两个不是红黑树的二叉树:

红黑树中专门虚设了一种结点——NIL结点。分析问题是要强行在叶结点上添上左右子NIL结点。《算法导论》中比较混乱,称添加上的虚设的NIL结点为叶节点,我个人认为这样子会实际叶节点产生混乱,干脆就将这些虚添的称为NIL结点。上面两个图给出了两个不是红黑树的例子,便于加强对红黑树的理解,因为正因为有了性质5才会有后面的引理13.1。(注意数黑高的时候是不包括根结点,但是要包括NIL结点)。

看过二叉搜索树的朋友肯定知道,在二叉搜索树里,个子越小(二叉树高度越矮)意味着搜索速度越快,也越优秀。 红黑树之所以被提出,就是为了将二叉树变得尽量平衡(尽量平衡也就是尽量降低二叉树的高度)。我们知道二叉树最平衡的情况肯定是层数最低的情形,按照二叉树的性质有n个节点的二叉树高度k(n)肯定不低于log^{_{2}}(n+1)(这里2是log的底),即包含n个节点的二叉树高度k(n)一定满足:

                                                                              k(n)\geqslant log^{_{2}}(n+1)

这里2是log的底,这个性质很容易查到并证明,大家可以百度,可以参考下面的文章:

http://www.cnblogs.com/skywang12345/p/3576328.html

这是二叉树树高的下限,也就是结点数目n给定的条件下,你要创建一颗二叉树,不管你怎么创建,它的个子总是会高于某个值,这好比是人类要生娃,生出来的娃长大后的高度总会高于一个数!  红黑树也是二叉树,因此它肯定也满足这个性质。

因此,结点数目为n的二叉树的高度总是下面这些整数之一:

                                                                  \left \lceil log^{_{2}}(n+1) \right \rceil\left \lceil log^{_{2}}(n+1) \right \rceil+1, ..., n

上面这个排列,也就是从最平衡(优秀)到最不平衡(优秀)的排列。

长得最高(最不优秀,即最不平衡)的那个二叉树肯定是一条链连到底的那个(更严格的讲就是树度数为1的二叉树),高度当然就是n。

现在,红黑树来了,它有它自己的基因(性质就是它的基因),它的基因冥冥之中已经决定了它不会长的太高。也正因为它不会太高,它才有存在的意义。这就好比是做人,普通点低调点有时候反而是一种优势,太优秀(搜索效率最高,最平衡的二叉树)的容易英年早逝(创建太难),太差劲了(太高)了又天天被鄙视(效率低),不高不矮的红黑树恰好!!!红黑树好比是普通人家的娃,更容易养活,更实在。

 按照红黑树的性质建立的二叉树高度是不会太高的,因为红黑树有个引理:

引理13.1 一颗有n个内部节点的红黑树的高度至多为2log^{_{2}}(n+1),  这里2是log的底。

(这个公式可以在《算法导论》里查到)。这个引理也就是告诉作为一颗红黑树是有上限的,也就是说它再差(高)也差(高)不到哪里去,这又是普通二叉树所没有的性质。

因此,我们可以知道这么一个结论,就是红黑树的高度k(n)有个范围(2是log的底):

                                                                   2log^{_{2}}(n+1)\geqslant k(n)\geqslant log^{_{2}}(n+1)

所以,在《算法导论》中提到有这么一句话:红黑树确保没有一条路径会比其他路径长出2倍,因而近似于平衡的

上面的公式就说明了这句话的含义。

至于13.1这个引理是怎么证明出来的,《算法导论》中有说明。

 

参考:

https://blog.csdn.net/lanchunhui/article/details/75905478

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值