堆中i结点的子树大小至多为2n/3的证明

摘自:http://bbs.sjtu.edu.cn/bbstcon,board,Algorithm,reid,1242723801,file,M.1242723801.A.html

本人做特殊整理。

算法导论:6.3-3

堆中i结点的子树大小至多为2n/3的证明

 问题:在任一含n个元素的堆中,至多有ceiling(n/(2^(h+1)))个高度为h的节点。

证明:

当堆是满二叉树时:
最底层的元素个数为ceiling(n/2)个,这层高度为0;
倒数第二层元素个数为ceiling(n/4)个,高度为1;
倒数第三层元素个数为ceiling(n/8)个,高度为2;
如此类推,高度为h的,在倒数第h + 1层,元素个数为ceiling(n / 2^(h + 1))。

若堆不是满二叉树,这个数目则总少于ceiling(n / 2^(h + 1))了。

问题:一棵以节点i为根的、大小为n的子树上,i节点的子树大小至多为2n/3(最坏情况:底层恰好半满的时候),怎么证明?

证明:

这里应该是讨论完全二叉树,规定总size为n,要求根的左子树的最大size。(由于右子树size总是<=左子树size)。

那么显然,观察最底层节点数目为0, 1, 2...的情况,显然半满的时候左子树达到了最大。以下求此时左子树的大小:

设底层半满时节点数为x,则再加x个节点,就是满树:n + x = 2x * 2 - 1 = 满树size
可得n = 3x - 1。
满树时,左子树节点数 = (满树size - 1) / 2 = 2x -1 ~= 2n / 3

你可能感兴趣的:(算法)