第五章课后答案
1. 一棵度为2的树与一棵二叉树有何区别?树与二叉树之间有何区别? 答:度为2的树,不是一棵二叉树,因为度为2 的树只有一种形态,而二叉树有两种形态。在二叉树中,每个结点的孩子是有左右之分的,而树中每个结点的孩子之间没有次序限制。即使在有序树中,每个结点的孩子之间限定了相对次序,但也没有左右之分的。 可见树和二叉树是两种不同的树型结构。首先:二叉树中每个结点最多有两个子树,而树不一定。其次:树中的结点的孩子是没有左右之分的,而二叉树中结点的孩子是有左右之分的。2(1) 它的顺序存储结构示意图:ABCDEFGH(2) 它的二叉链表存储结构示意图:ABCDEFHG(3) 它的三叉链表存储结构示意图DABCEFGH4. 画出图540所示的森林经转换后所对应的二叉树,并指出在二叉链表中某结点所对应的森林中结点为叶子结点的条件。ABCDEFGHIJABCDEFGHIJ9. 已知一棵度为m的树中有n1个度为1的结点,n2个度为2的结点,nm个度为m的结点,问该树中共有多少个叶子结点?有多少个非终端结点? 解: 设树中有n0个叶子结点,那么树中结点总数目N为 N=n0+n1+n2+nm 如果B是树中的总分支数,则:N=B+1 而 B= 0*n0+1*n1+2*n2+m*nm 从而有N= n0+n1+n2+nm=0*n0+1*n1+2*n2+m*nm+1 得出 n0=n2+2*n3+(m-1)*nm+1 所以该数中叶子结点总数为n0=n2+2*n3+(m-1)*nm+1 而树中非终端结点数=结点总数-终端结点数 = n0+n1+n2+nm- n0 = n1+n2+nm11. 设高度为h的二叉树上只有度为0和度为2的结点,问该二叉树的结点数可能达到的最大值和最小值。 答:最大值:2h-1 最小值:2h-112. 求表达式(a+b*(c-d)-e/f)的波兰式和逆波兰式。 波兰式: - + a * b c d / e f 逆波兰式:a b c d - * + e f / - 15. 画出和下列已知序列对应的树T。 层次序列:A B C D E F G H I J 中序序列:D B G E H J A C I FABCEFGHDIJ 1. 给定一棵用二叉表示的二叉树,其根指针为root。试写出求二叉树结点的数目的算法。 int countnode(bitree root) if (root = =NULL)return 0;if (root->lchild =NULL && root->rchild =NULL)return 1;return (countnode(root->lchild)+ countnode(root->rchild)+1);3. 给定一棵用链表表示的二叉树,其根指针为root。试写出求二叉树深度的算法。 int depth (bitree root)int d1,d2;if (root = =NULL)return 0;if (root->lchild =NULL && root->rchild =NULL)return 1;d1= depth(root->lchild);d2= depth(root->rchild);if(d1>d2)return (d1+1) else return (d2+1);5. 给定一棵用链表表示的二叉树,其根指针为root。试写出将二叉树中所有结点的左、右子树相互交换的的算法。void changelr(bitree root) bitree p; if (root = =NULL)return ; p=root ->lchild; root ->lchild=root ->rchild, root ->rchild=p; changelr(root ->lchild); changelr(root ->rchild);