一、证明:一棵满k叉树上的叶子节点数n0和非叶子节点数n1之间满足以下关系:n0=(k-1)n1+1
答:
设满k叉树的结点总数为n,则有n=n0+n1。再看k叉树的分支数,除了根节点以外其余结点都有一个分支进入,分支总数为n-1,由于这些分支是由度为k的结点射出的,所以分支总数又为kn1。所以kn1=n-1=n0+n1-1。所以n0=(k-1)n1+1。
二、证明:由一棵二叉树的先序序列和中序序列可唯一确定这棵二叉树。
答:
用数学归纳法进行证明。
当n=1时,结论显然可知成立。
假设当n<=k时,结论成立。当n=k+1时,假设前序序列为{a1,a2,a3,...am},假设中序序列为{b1,b2,b3,...bm}。
可以知道存在bj与a1相同。如果j=1,二叉树无左子树,显然由{a2,a3,...am}和{b2,b3,...bm}可以唯一确定一个二叉树的右子树。如果j=m,二叉树无右子树,由{a2,a3,...am}和{b1,...bm-1}可以唯一确定一个二叉树的左子树。如果j为其他情况,由{a2,...aj}和{b1,...bj-1}可以唯一确定一个二叉树的左子树。由{aj+1,...am}和{bj+1,...bm}可以唯一确定一个二叉树的右子树。
综上,由一棵二叉树的先序序列和中序序列可唯一确定这棵二叉树。
三、若已知两棵二叉树B1和B2皆为空,或者皆不空且B1的左、右子树和B2的左、右子树分别相似,则称二叉树B1和B2相似。试编写算法,判别给定两棵二叉树是否相似。
答:
采用递归的思想求解。若B1和B2都是空树,则相似;若有一个为空另一个不为空,则不相似;否则递归地比较他们的左、右子树是否相似。最后得到结果。
该算法实现的伪代码如下:
/* 函数名称:判断两棵二叉树是否相似的递归算法 传入参数:两个需要判断的二叉树 返回值:相似返回TRUE否则返回FALSE */ Status isSimilar(BiTree B1, BiTree B2) { if(!B1 && !B2) //如果两树皆空表明相似 return TRUE; else if(B1 && !B2 || !B1 && B2) //如果只有一个树为空表明不相似 return FALSE; else{ if(isSimilar(B1 -> lchild, B2 -> lchild) && isSimilar(B1 -> rchild, B2->rchild)) //递归判断左右子树是否相似 return TRUE; else return FALSE; } }
算法分析:本算法通过递归的方法实现,代码简洁,是解决该问题的较好的方法。