求证:在任一含n个元素的堆中,至多有┌n/2h+1┐w个高度为h的节点。
首先解释一下名词的概念:
节点高度(height of node):从在该节点下的最低的叶子向上,该节点所在的层数
节点深度(depth of node):从根节点向下,经过的层数。
注意:以上计数都是从0开始的,如图1:
节点4的高度为2,深度为2
节点5的高度为1,深度为2
因此,属于同一层的节点一定有同样的深度,但是高度可能相同,也可能相差1.
图1 图2
证明:(1)先证当h=0时,该结论是成立的。
h=0,即高度为0的节点,显然是叶子节点,这些节点有两种,第一种A在树的最下面的一层的所有节点,第二种B是在倒数第二层没有叶子结点的结点。对于有n个节点的堆:
当n为奇数时,如图1所示,叶子节点共有k1=┌n/2┐个,相应地非叶子节点有k2=n-┌n/2┐=└n/2┘个,可以看出k1=k2+1,即n=2*k1-1,得出k1=(n+1)/2=┌n/20+1┐(因为n为奇数),属于叶子节点的高度都为0,即我们要证的h=0,得证。
当n为偶数时,如图2,可以利用n为奇数时的结论,为其添加一个节点,研究n+1个节点的叶子节点。有叶子节点k1'=┌(n+1)/2┐=n/2+1个,n+1=2*k1'-1,k1'比k1多一个添加的叶子节点,故k1=k1'-1=n/2=┌n/20+1┐(因为n为偶数)。
(2)下面证,已知高度为h-1的节点至多有┌n/2h┐个,高度为h的点至多有┌n/2h+1┐个。
对于高度为h-1的点,无论它是叶子节点还是内部节点,它们的所有的父节点一定是高度为h的节点,所以可以从这里下手,已知高度为h-1的节点至多有┌n/2h┐,刚它的父节点个数为C=┌┌n/2h┐/2┐。
当n为奇数时,┌n/2h┐=(n+1)/2h,上式可化为C=┌(n+1)/2h+1┐,同样因为n为奇数,C=┌n/2h+1┐;当n为偶数时,┌n/2h┐=n/2h,父节点个数为C=┌(n/2h)/2┐=┌n/2h+1┐。
综上,可得证。
===========================分割线===================================
吐糟一下,网上有算法导论的答案,参考了一下,觉得外国人分析的也真挺严密的,以上是我的理解。还是要原创嘛。
数学符号实在找不到,只能先用这个奇怪的┌┐代替,哈哈,发现自己已经习惯用这个了。
第一次用GIMP作图,把PS的思想全盘搬,发现自己快要疯掉了,没办法,要用Linux就要逐渐摆脱对各种软件的信赖。
以上如果有不严密的地方,欢迎一起来討論。