证明:当n = 1时,高度为h=0的结点的个数为1=ceiling(1/(2^(0+1)))。
当n>=2时,任意给定一个n,用数学归纳法证明。
1、base:当h=0时,即高度为0的结点就是叶子结点。根据《算法导论》习题6.1-7可知,叶子结点的数目为
n-floor(n/2)=ceiling(n/2)=ceiling(n/(2^(0+1))),即满足上式。
2、step:取k为满足0<=k<floor(log2N)的任意整数(注释:log2N是以2为底n的对数)。假设对于高度h=k的结点,高度为k的结点数目是ceiling(n/(2^(h+1)))。
则高度为h=k+1的结点就是高度为k结点的父节点。高度为k结点的父节点的数目是高度为k结点的数目除2向上取整。
即ceiling(ceiling(n/(2^(k+1)))/2) = ceiling(n/(2 ^ (k+1+1)))。
证毕。
(缺少求高度为k结点的父节点的数目的方法介绍,可以求出第一个高度为k的结点的父节点的下标,再求出最后一个高度为k结点的父节点,两者之间就是所有父节点)。
参考:
参考1:《算法导论》CH6 习题6.3-3的证明,缺少对父节点数目求法的介绍。
参考2:Exercise 6.3.3,第二个参考可能是假设对任意n,当高度为h-1时成立。这个方法更好,因为避免求父节点数目。缺点是有点难懂。具体来看,已知,对于任意n,h=0成立。(则可推出,对于任意n,若h=1存在,则公式成立)。下图是参考2.