【解答】错。二叉树和树是两种不同的树结构,例如,左斜树是一棵二叉树,但它的度为1。
⑷ 由树转换成二叉树,其根结点的右子树总是空的。 【解答】对。因为根结点无兄弟结点。
⑸ 用一维数组存储二叉树时,总是以前序遍历存储结点。
【解答】错。二叉树的顺序存储结构是按层序存储的,一般适合存储完全二叉树。
4.证明:对任一满二叉树,其分枝数B=2(n0-1) 。(其中,n0为终端结点数) 【解答】因为在满二叉树中没有度为1的结点,所以有: n=n0+n2
设B为树中分枝数,则 n=B+1 所以 B=n0 +n2-1 再由二叉树性质: n0=n2+1 代入上式有:
B=n0+n0-1-1=2(n0-1)
5.证明:已知一棵二叉树的前序序列和中序序列,则可唯一确定该二叉树。 【解答】证明采用归纳法。
设二叉树的前序遍历序列为a1a2a3… an,中序遍历序列为b1b2b3… bn。 当n=1时,前序遍历序列为a1,中序遍历序列为b1,二叉树只有一个根结点,所以,a1= b1,可以唯一确定该二叉树;
假设当n<=k时,前序遍历序列a1a2a3… ak和中序遍历序列b1b2b3… bk可唯一确定该二叉树,下面证明当n=k+1时,前序遍历序列a1a2a3… akak+1和中序遍历序列b1b2b3… bk bk+1可唯一确定一棵二叉树。
在前序遍历序列中第一个访问的一定是根结点,即二叉树的根结点是a1,在中序遍历序列中查找值为a1的结点,假设为bi,则a1=bi且b1b2… bi-1是对根结点a1的左子树进行中序遍历的结果,前序遍历序列a2a3… ai是对根结点a1的左子树进行前序遍历的结果,由归纳假设,前序遍历序列a2a3… ai和中序遍历序列b1b2… bi-1唯一确定了根结点的左子树,同样可证前序遍历序列ai+1ai+2… ak+1和中序遍历序列bi+1bi+2… bk+1唯一确定了根结点的右子树。
6.已知一棵度为m的树中有:n1个度为1的结点,n2个度为2的结点,……,nm个度为m的结点,问该树中共有多少个叶子结点? 【解答】设该树的总结点数为n,则 n=n0+n1+n2+……+nm 又:
n=分枝数+1=0×n0+1×n1+2×n2+……+m×nm+1
由上述两式可得:
n0= n2+2n3+……+(m-1)nm+1
7.已知二叉树的中序和后序序列分别为CBEDAFIGH和CEDBIFHGA,试构造该二叉树。
【解答】二叉树的构造过程如图5-12 所示。
8.对给定的一组权值W=(5,2,9,11,8,3,7),试构造相应的哈夫曼树,并计算它的带权路径长度。
【解答】构造的哈夫曼树如图5-13所示。
树的带权路径长度为:
WPL=2×4+3×4+5×3+7×3+8×3+9×2+11×2 =120
9.已知某字符串S中共有8种字符,各种字符分别出现2次、1次、4次、5次、7次、3次、4次和9次,对该字符串用[0,1]进行前缀编码,问该字符串的编码至少有多少位。
【解答】以各字符出现的次数作为叶子结点的权值构造的哈夫曼编码树如图5-14所示。其带权路径长度=2×5+1×5+3×4+5×3+9×2+4×3+4×3+7×2=98,所以,该字符串的编码长度至少为98位。
10.算法设计
⑴ 设计算法求二叉树的结点个数。
【解答】本算法不是要打印每个结点的值,而是求出结点的个数。所以可将遍历算法中的“访问”操作改为“计数操作”,将结点的数目累加到一个全局变量中,每个结点累加一次即完成了结点个数的求解。 具体算法如下:
⑵ 设计算法按前序次序打印二叉树中的叶子结点。
【解答】本算法的要求与前序遍历算法既有相同之处,又有不同之处。相同之处是打印次序均为前序,不同之处是此处不是打印每个结点的值,而是打印出其中的叶子结点,即为有条件打印。为此,将前序遍历算法中的访问操作改为条件打印即可。算法如下:
⑶ 设计算法求二叉树的深度。
【解答】当二叉树为空时,深度为0;若二叉树不为空,深度应是其左右子树深度的最大值加1,而其左右子树深度的求解又可通过递归调用本算法来完成。具体算法如下:
⑷ 编写算法,要求输出二叉树后序遍历序列的逆序。
【解答】要想得到后序的逆序,只要按照后序遍历相反的顺序即可,即先访问根结点,再遍历根结点的右子树,最后遍历根结点的左子树。注意和前序遍历的区别,具体算法如下:
⑸ 以二叉链表为存储结构,编写算法求二叉树中结点x的双亲。 【解答】对二叉链表进行遍历,在遍历的过程中查找结点x并记载其双亲。具体算法如下:
⑹ 以二叉链表为存储结构,在二叉树中删除以值x为根结点的子树。 【解答】对二叉链表进行遍历,在遍历的过程中查找结点x并记载其双亲,然后将结点x的双亲结点中指向结点x的指针置空。具体算法如下:
⑺ 一棵具有n个结点的二叉树采用顺序存储结构,编写算法对该二叉树进行前序遍历。
【解答】按照题目要求,设置一个工作栈以完成对该树的非递归算法,思路如下: ① 每访问一个结点,将此结点压栈,查看此结点是否有左子树,若有,访问左子树,重复执行该过程直到左子树为空。
② 从栈弹出一个结点,如果此结点有右子树,访问右子树执行步骤①,否则重