坏了坏了,被二叉树俘虏了。数据结构真的是很奥妙啊,对于一些比较难的性质我也想挑战一下证明,脑力耗尽了........
1.对于任何一棵二叉树T,如果其叶子数为n0,度为2的结点数为n2,则n0=n2+1.
这个结论的证明真的有一种开拓思路的感觉,让人眼前一亮。
首先从结点的角度看:
可以发现所有的结点可以按照孩子的数量分为三种,n0,n1,n2。所有的结点的总数为n0+n1+n2。
然后从边的角度考虑:
发现所有的结点(除了根结点)必然有一根链接双亲的线,那么如果有N个结点,那么就有N-1条线,观察出线的数量是N-1。而双亲链接的孩子数量,就是线的数量(n1+2*n2)。
N-1=n1+2*n2=n0+n1+n2
两侧相消,可知n0=n2+1。
2.具有n个结点的完全二叉树的深度为[log2n]+1。
对于任意的n,2^(k-1)-1<=n<2^k-1,k为此时树的深度。显然可知k-1<=log2n<k,高斯函数向下取整后加1即产生k。
3.如果对于一颗有n个结点的完全二叉树(深度为[log2n]+1)的结点按层序编号,则对任一结点i(1<=i<=n),有:
(1)如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲是结点[i/2]
(2)如果2i>n,则结点i为叶子节点并且在最底层,无左孩子;否则,其左孩子是节点2i。
(3)如果2i + 1 > n,则结点i无右孩子;否则,其右孩子是节点2i+1.
这是王越老师ppt上的内容,翻译成人类的语言就是:对于一个结点i,它的双亲是结点[i/2],而它的左孩子是2i,右孩子是2i+1(前提是不能超过n)。
关于这题,我认为用数学归纳法是可以证明的。(不太懂数学,这是数学归纳法吗?)
对于一个结点k而言,它的下一个结点为k+1,而这个结点对于结点k而言两种情况:
第一种情况:k+1位于k的右侧
假设性质1,2,3是正确的,那么k结点的左右子树为2k,2k+1。那么k+1结点的左右子树分别为2k+2,2k+3。
如图所示,
那么发现2*(k+1)=2k+2,2*(k+1)+1=2k+3,[2k+2/2]=k+1,[2k+3/2]=k+1,即对于k+1结点,性质1,2,3均成立。
第二种情况:k+1位于k的下一行的开头
同情况1,先绘制出k结点与其左右孩子的图像
如图所示,
但是此时不用做任何假设,因为直接观察就可得到对于结点k而言,性质1,2,3均成立。
综合上述两种情况,对于k结点,无论k+1的位置落再k的右侧还是左下,结点总是符合这三个性质的!k结点可推广至任意符合条件的结点,由此证毕,以后哪怕记不住结论也可以现场再推一遍了!