您的位置:首页 > 运维架构

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

2015-12-05 12:30 417 查看
思路源自于:

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=堆(完全二叉树)中左子树节点数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: