机器喵之红黑树(一)

算法导论里是这样定义一棵红黑树的:

  1、每个结点或是红色的,或是黑色的
  2、根节点是黑色的
  3、每个叶结点(NIL)是黑色的
  4、如果一个节点是红色的,则它的两个儿子都是黑色的。
  5、对于每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑色结点。

红黑树是一个平衡的二叉树,但不是一个完美的平衡二叉树。虽然我们希望一个所有查找都能在~lgN次比较内结束,但是这样在动态插入中保持树的完美平衡代价太高,所以,我们稍微放松逛一下限制,希望找到一个能在对数时间内完成查找的数据结构。
红黑树是在普通二叉树上,对没个节点添加一个颜色属性形成的,同时整个红黑二叉树需要同时满足一下五条性质
《机器喵之红黑树(一)》

上图引理:一棵有n个内结点的红黑树的高度至多为2lg(n+1)
对以x为根的子树,它所包含的内部结点数至少为2^[bh(x)]-1。这里bh(x)(bh嘛,black height)被定义为结点x的黑高度,就是说,从结点x(不包括它本身)到它任一个叶结点的路径上所有黑色结点的个数。

证明一:

(1)若x高度为0,那么它就是一叶子结点,它确实至少包含2^0-1=0个内部结点

(2)假设x为红黑树的某一内部结点,且它高度h>0,那么它的黑高度就是bh(x),但是它的两个孩子结点呢?这个就根据它们的颜色来判断了: 如果x有一个红色的孩子y,那么y的黑高度bh(y)=bh(x),看看上面对黑高度的定义你就明白了——既然它是红色的,那么它的黑高度就应该和它父亲的黑高度是一样的;
如果x有一个黑色的孩子z,那么z的黑高度bh(z)=bh(x)-1,这个怎么解释呢,因为它自己就是个黑结点,那么在计算它的黑高度时,必须把它自己排除在外(还是根据定义),所以它是bh(x)-1。

(3)x的孩子结点所构成的子树的高度肯定小于x这颗子树,那么对于这两个孩子,不管它们颜色如何,一定满足归纳假设的是至少hb 高度为bh(x)-1。所以,对x来说,它所包含的内部结点个数“至少”为两个孩子结点所包含的内部结点数,再加上它自己,于是就为2^[bh(x)-1]-1+2^[bh(x)-1]-1+1=2^[bh(x)]-1,归纳证明完毕。
也就是说n>=2^[bh(x)]-1———①

把一 中红黑树性质中(4)、(5)两个特性结合起来,其实我们可以得到黑节点至少是红节点的2倍。用一句话来说就是“有红必有黑,但有黑未必一定有红”。为什么这么说呢,因为从特性(4)我们知道,如果有一个红结点存在,那么它的儿子结点一定是黑的,最极端的情况下,该路径上所有的结点就被红、黑两种结点给平分了那就是黑节点至少是红节点的2倍。不知这个问题我解释清楚没有,因为这是往下理解的关键。

如果一棵红黑树的高为h,那么在这个高度上(不包括根结点本身)至少有1/2h的黑结点,再结合上面对“黑高度”的定义,我们说,红黑树根结点的黑高度至少是1/2h,好了,我们拿出公式①,设n为该红黑树所包含的内部结点数,我们得出如下结论: n>=2^(1/2h)-1。 我们把它整理整理,就得到了h<=2lg(n+1),就是我们要证明的结论:红黑树的高度最多也就是2lg(n+1)。

证明二:

《机器喵之红黑树(一)》

“一棵含有n个节点的红黑树的高度至多为2log(n+1)” 的逆否命题是 “高度为h的红黑树,它的包含的内节点个数至少为 2h/2-1个”。
我们只需要证明逆否命题,即可证明原命题为真;即只需证明 “高度为h的红黑树,它的包含的内节点个数至少为 2h/2-1个”。

从某个节点x出发(不包括该节点)到达一个叶节点的任意一条路径上,黑色节点的个数称为该节点的黑高度(x’s black height),记为bh(x)。关于bh(x)有两点需要说明:
第1点:根据红黑树的”特性(5) ,即从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点”可知,从节点x出发到达的所有的叶节点具有相同数目的黑节点。这也就意味着,bh(x)的值是唯一的!
第2点:根据红黑色的”特性(4),即如果一个节点是红色的,则它的子节点必须是黑色的”可知,从节点x出发达到叶节点”所经历的黑节点数目”>= “所经历的红节点的数目”。假设x是根节点,则可以得出结论”bh(x) >= h/2″。进而,我们只需证明 “高度为h的红黑树,它的包含的黑节点个数至少为 2bh(x)-1个”即可。

**到这里,我们将需要证明的定理已经由”一棵含有n个节点的红黑树的高度至多为2log(n+1)”
转变成只需要证明”高度为h的红黑树,它的包含的内节点个数至少为 2bh(x)-1个”。**

下面通过”数学归纳法”开始论证高度为h的红黑树,它的包含的内节点个数至少为 2bh(x)-1个”。
(01) 当树的高度h=0时, 内节点个数是0,bh(x) 为0,2bh(x)-1 也为 0。显然,原命题成立。
(02) 当h>0,且树的高度为 h-1 时,它包含的节点个数至少为 2bh(x)-1-1。这个是根据(01)推断出来的!

下面,由树的高度为 h-1 的已知条件推出“树的高度为 h 时,它所包含的节点树2bh(x)-1”。

当树的高度为 h 时,
对于节点x(x为根节点),其黑高度为bh(x)。
对于节点x的左右子树,它们黑高度为 bh(x) 或者 bh(x)-1。
根据(02)的已知条件,我们已知 "x的左右子树,即高度为 h-1 的节点,它包含的节点至少为 2bh(x)-1-1 个";

所以,节点x所包含的节点至少为 ( 2bh(x)-1-1 ) + ( 2bh(x)-1-1 ) + 1 = 2^bh(x)-1。即节点x所包含的节点至少为 2bh(x)-1。
因此,原命题成立。

由(01)、(02)得出,"高度为h的红黑树,它的包含的内节点个数至少为 2^bh(x)-1个"。
因此,“一棵含有n个节点的红黑树的高度至多为2log(n+1)”。

    原文作者:算法小白
    原文地址: https://segmentfault.com/a/1190000015315352
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞