维护堆性质中,堆(完全二叉树)中i结点的子树大小至多为2n/3的证明

思路源自于:
http://bbs.sjtu.edu.cn/bbstcon,board,Algorithm,reid,1242723801,file,M.1242723801.A.html
在理解维护堆性质时,算法导论上面只简单提了一下子树的大小为2n/3,不明白,从网上理解得到如下结论。
已知:
当堆是满二叉树时:(ceiling表示其最大值)
最底层的元素个数为ceiling(n/2)个,这层高度为0;
倒数第二层元素个数为ceiling(n/4)个,高度为1;
倒数第三层元素个数为ceiling(n/8)个,高度为2;
如此类推,高度为h的,在倒数第h + 1层,元素个数为ceiling(n / 2^(h + 1))。
注意:高度是从最底层算起,最底层为0,而深度是从最高层算起,根节点处为高度0.
证明如下:
规定总size为n,要求根的左子树的最大size。(由于右子树size总是<=左子树size)。那么显然,观察最底层节点数目为0, 1, 2…的情况,显然半满的时候左子树达到了最大。半满定义:最底层的叶子节点个数=满二叉树的一半,且底层半满的元素都在左子树上面。以下求此时左子树的大小:
设底层半满时节点数为y,则再加y个节点,就是满树,并且根据满二叉树的特点—若底层元素个数为x,则元素总数为2x-1.
由此得到:n + y = (2y) * 2 - 1 = 满树size,可得n = 3y - 1。
满树时,左子树节点数 = (满树size - 1) / 2 = (4y-1)/2=2y= 2n / 3=堆(完全二叉树)中左子树节点数。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值