二叉树(部分)
二叉树几个重要的性质:
1、二叉树的第 i 层上至多有2^(i-1) 个节点
利用归纳法容易证得此性质。
现在假定对所有的j,1<=j<i,命题成立,即第j层上至多有2^(j-1)个节点。那么,可以证明 j = i 时命题也成立。
由归纳法假设:第 i - 1 层上至多有 2^(i-2)个结点。由于二叉树的每个结点的度最多为2,故在第 i 层上的最大结点数为第 i - 1 层上的最大结点数为第 i - 1层上的最大结点数的2倍,即2*2^(i-2) = 2^(i-1)。
2、深度为k的二叉树的最大结点数为
∑(i=1 -> k 第 i 层上的最大节点数) = ∑ 2^(i - 1) ( i = 1 -> k) = 2^k - 1
3、对任何一棵二叉树T, 如果其终端节点数为n0 , 度为2的结点数为n2,则n0 = n2 + 1。
4、具有 n 个节点的完全二叉树的深度为[ log2 ( n ) ] + 1 。
5、如果对一棵有 n 个结点的完全二叉树的结点按层序编号,则对任意结点 i ,有
(1)如果 i = 1, 则结点 i 是二叉树的根,无双亲; 如果 i > 1, 则双亲PARENT( i )是结点[ i / 2 ]。
(2)如果2i > n,则结点 i 无左孩子;否则其左孩子为LCHILD( i )是结点2i。
(3)如果对2i + 1 > n ,则结点 i 无右孩子;否则其右孩子RCHILD( i )是结点 2i + 1;
拓展:(课后习题)
一棵深度为H的满k叉树有如下性质:第H层上的结点都是叶子结点,其余各层上每个结点都有k棵非空子树。如果按层次顺序从1开始对全部结点编号,问:
(1) 各层的结点数目是多少?
(2) 编号为p的结点的父结点(若存在)的编号是多少?
(3) 编号为p的结点的第i个儿子结点(若存在)的编号是多少?
(4) 编号为p的结点有右兄弟的条件是什么?其右兄弟的编号是多少?
解:
(1) (K^H -1) / (K - 1)
(2)如果p是其双亲的最小的孩子(右孩子),则p减去根结点的一个结点,应是k的整数倍,该整数即为所在的组数,每一组为一棵满k叉树,正好应为双亲结点的编号。如果p是其双亲的最大的孩子(左孩子),则p+k-1为其最小的弟弟,再减去一个根结点,除以k,即为其双亲结点的编号。
综合来说,对于p是左孩子的情况,i=(p+k-2)/k;对于p是右孩子的情况,i=(p-1)/k
如果左孩子的编号为p,则其右孩子编号必为p+k-1,所以,其双亲结点的编号为 i = [ (p + k - 2) / k] 向下取整,如1.5向下取整为1
(3)结点p的右孩子的编号为kp+1,左孩子的编号为kp+1-k+1=k(p-1)+2,第i个孩子的编号为k(p-1)+2+i-1=kp-k+i+1。
(4)当(p-1)%k != 0时,结点p有右兄弟,其右兄弟的编号为p+1。
已知一棵度为k的树中有个度为1的结点,个度为2的结点,…,个度为k的结点,问该树中有多少个叶子结点?
解:根据树的定义,在一颗树中,除树根结点外,每个结点有且仅有一个前驱结点,也就是说,每个结点与指向它的一个分支一一对应,所以除树根结点之外的结点树等于所有结点的分支数,即度数,从而可得树中的结点数等于所有结点的度数加1。总结点数为
而度为0的结点数就应为总结点数减去度不为0的结点数的总和,即
已知在一棵含有n个结点的树中,只有度为k的分支结点和度为0的叶子结点。试求该树含有的叶子节点数目。
解:利用上题结论易得结果。设度为k的结点个数为,则总结点数为。叶子结点的数目应等于总结点数减去度不为0的结点的数目,即
一棵含有n个结点的k叉树,可能达到的最大深度和最小深度各为多少?
解:能达到最大深度的树是单支树,其深度为n。满k叉树的深度最小,其深度为
(证明见徐孝凯著数据结构实用教程P166)
证明:一棵满k叉树上的叶子结点数和非叶子结点数之间满足以下关系:
解:一棵满k叉树的最后一层(深度为h)的结点数(叶子结点数)为,其总结点数为,则非叶子结点数,从而得