算法导论第六章堆排序的一段话
当MAX-HEAPIFY作用在一棵以结点i为根的、大小为n的子树上时……………i结点的子树大小至多为2n/3(最坏情况发生在最低层恰好半满的时候)………. 为什么子树大小至多为2n/3?
在网上搜到一个分析:
n0+n1+n2=n (1) n1+2n2+1=n (2) 由(1),(2)得, n0=n2+1,因为二叉堆是完全二叉树,且最后一层半满,即n1=0,得: n0=(n+1)/2 则最后一层为x,倒数第二层的叶子结点为x/2: x+x/2=n0=>x=(n+1)/3 所以子树大小至多为 (x+n-1)/2=((n+1)/3+n-1)/2=(2n-1)/3<=2n/3
恕我愚钝,还是没有看懂啊,n0,n1,n2分别代表什么,高度为0,1,2的节点数?为什么n1为0?最底层半满是什么意思?
有没有大侠可以给出比较清晰的分析过程呢?
万分感激!!!!!!
[解决办法]
假设堆的高度为(m+1), 最后一层的个数为s个, 如1楼的情况m=3, s=3
则整个堆的节点个数 n = (2^m - 1) + s
除了根以外,左子树的节点个数=2^(m-1) - 1 + n1, 右子树的节点个数2^(m-1) - 1 + n2
其中n1+n2=s
当最下层半满时, n1 = 2^(m-1), n2=0
因此左子树节点个数=2* 2^(m-1) - 1, n= 3 * 2^(m-1) - 1
左子树个数=2/3 * n - 1/3