1、第六章习题1试分别画出具有3个结点的树和3个结点的二叉树的所有不同形态。2对题1所得各种形态的二叉树,分别写出前序、中序和后序遍历的序列。3已知一棵度为k的树中有n1个度为1的结点,n2个度为2的结点,,nk个度为k的结点,则该树中有多少个叶子结点并证明之.4。假设一棵二叉树的先序序列为EBADCFHGIKJ,中序序列为ABCDEFGHIJK,请画出该二叉树。5已知二叉树有50个叶子结点,则该二叉树的总结点数至少应有多少个?6给出满足下列条件的所有二叉树: 前序和后序相同 中序和后序相同 前序和后序相同7 n个结点的K叉树,若用具有k个child域的等长链结点存储树的一个结点,则空的Child
2、域有多少个?8画出与下列已知序列对应的树:树的先根次序访问序列为GFKDAIEBCHJ;树的后根次序访问序列为DIAEKFCJHBG.9假设用于通讯的电文仅由8个字母组成,字母在电文中出现的频率分别为:0.07,0。19,0。02,0.06,0.32,0.03,0。21,0.10请为这8个字母设计哈夫曼编码.10已知二叉树采用二叉链表存放,要求返回二叉树T的后序序列中的第一个结点指针,是否可不用递归且不用栈来完成?请简述原因.11。 画出和下列树对应的二叉树:12已知二叉树按照二叉链表方式存储,编写算法,计算二叉树中叶子结点的数目。13编写递归算法:对于二叉树中每一个元素值为x的结点,删去以它
3、为根的子树,并释放相应的空间。14分别写函数完成:在先序线索二叉树T中,查找给定结点*p在先序序列中的后继。在后序线索二叉树T中,查找给定结点*p在后序序列中的前驱。15分别写出算法,实现在中序线索二叉树中查找给定结点*p在中序序列中的前驱与后继。16编写算法,对一棵以孩子-兄弟链表表示的树统计其叶子的个数。17对以孩子-兄弟链表表示的树编写计算树的深度的算法。18已知二叉树按照二叉链表方式存储,利用栈的基本操作写出后序遍历非递归的算法。 19设二叉树按二叉链表存放,写算法判别一棵二叉树是否是一棵正则二叉树。正则二叉树是指:在二叉树中不存在子树个数为1的结点.20计算二叉树最大宽度的算法。二叉
4、树的最大宽度是指:二叉树所有层中结点个数的最大值。21已知二叉树按照二叉链表方式存储,利用栈的基本操作写出先序遍历非递归形式的算法.22. 证明:给定一棵二叉树的前序序列与中序序列,可唯一确定这棵二叉树;给定一棵二叉树的后序序列与中序序列,可唯一确定这棵二叉树;23. 二叉树按照二叉链表方式存储,编写算法,计算二叉树中叶子结点的数目.24。 二叉树按照二叉链表方式存储,编写算法,将二叉树左右子树进行交换。实习题1。 问题描述 建立一棵用二叉链表方式存储的二叉树,并对其进行遍历(先序、中序和后序),打印输出遍历结果。基本要求 从键盘接受输入先序序列,以二叉链表作为存储结构,建立二叉树(以先序来建
5、立)并对其进行遍历(先序、中序、后序),然后将遍历结果打印输出。要求采用递归和非递归两种方法实现。测试数据 ABCDEGF(其中表示空格字符) 输出结果为: 先序:ABCDEGF 中序:CBEGDFA 后序:CGBFDBA2已知二叉树按照二叉链表方式存储,编写算法,要求实现二叉树的竖向显示(竖向显示就是二叉树的按层显示)。3如题1要求建立好二叉树,按凹入表形式打印二叉树结构,如下图所示.2. 按凹入表形式打印树形结构,如下图所示。 第六章答案6 1分别画出具有3个结点的树和3个结点的二叉树的所有不同形态。【解答】具有3个结点的树 具有3个结点的二叉树 6。3已知一棵度为k的树中有n1个度为1的
6、结点,n2个度为2的结点,,nk个度为k的结点,则该树中有多少个叶子结点?【解答】设树中结点总数为n,则n=n0 + n1 + + nk树中分支数目为B,则B=n1 + 2n2 + 3n3 + + knk因为除根结点外,每个结点均对应一个进入它的分支,所以有n= B + 1即n0 + n1 + + nk = n1 + 2n2 + 3n3 + + knk + 1由上式可得叶子结点数为:n0 = n2 + 2n3 + + (k-1)nk + 16.5已知二叉树有50个叶子结点,则该二叉树的总结点数至少应有多少个?【解答】n0表示叶子结点数,n2表示度为2的结点数,则n0 = n2+1 所以n2=
7、n0 1=49,当二叉树中没有度为1的结点时,总结点数n=n0+n2=99 6。6 试分别找出满足以下条件的所有二叉树:(1) 前序序列与中序序列相同;(2) 中序序列与后序序列相同;(3) 前序序列与后序序列相同。【解答】 (1) 前序与中序相同:空树或缺左子树的单支树; (2) 中序与后序相同:空树或缺右子树的单支树; (3) 前序与后序相同:空树或只有根结点的二叉树。6。9 假设通讯的电文仅由8个字母组成,字母在电文中出现的频率分别为:0。07,0.19,0.02,0。06,0。32,0.03,0。21,0.10请为这8个字母设计哈夫曼编码.【解答】 构造哈夫曼树如下:哈夫曼编码为:I1
8、:11111 I5:1100 I2:11110 I6: 10I3:1110 I7: 01 I4:1101 I8: 006.11画出如下图所示树对应的二叉树。【解答】6。15分别写出算法,实现在中序线索二叉树T中查找给定结点p在中序序列中的前驱与后继。在先序线索二叉树T中,查找给定结点p在先序序列中的后继。在后序线索二叉树T中,查找给定结点*p在后序序列中的前驱。(1)找结点的中序前驱结点BiTNode *InPre (BiTNode p)/*在中序线索二叉树中查找p的中序前驱结点,并用pre指针返回结果/ if (pLtag= =1) pre = p-LChild; /*直接利用线索*/els
9、e /*在p的左子树中查找“最右下端”结点*/ for ( q=pLChild; qRtag= =0; q=q-RChild); pre = q; return (pre); (2)找结点的中序后继结点BiTNode InSucc (BiTNode *p)/在中序线索二叉树中查找p的中序后继结点,并用succ指针返回结果*/ if (pRtag= =1) succ = pRChild; /直接利用线索/else /*在p的右子树中查找“最左下端”结点*/ for ( q=p-RChild; qLtag= =0; q=qLChild); succ= q; return (succ); (3) 找
10、结点的先序后继结点BiTNode PreSucc (BiTNode p)/在先序线索二叉树中查找p的先序后继结点,并用succ指针返回结果/ if (p-Ltag= =0) succ = pLChild; else succ= p-RChild;return (succ); (4) 找结点的后序前驱结点BiTNode SuccPre (BiTNode *p)/在后序线索二叉树中查找p的后序前驱结点,并用pre指针返回结果*/ if (pLtag= =1) pre = pLChild; else pre= pRChild;return (pre); 6.21已知二叉树按照二叉链表方式存储,利用栈
11、的基本操作写出先序遍历非递归形式的算法.【解答】Void PreOrder(BiTree root) /先序遍历二叉树的非递归算法/ InitStack(&S); p=root; while(p!=NULL !IsEmpty(S) ) if(p!=NULL) Visit(pdata);push(&S,p);p=pLchild; else Pop(S,p); p=pRChild;6.24已知二叉树按照二叉链表方式存储,编写算法,将二叉树左右子树进行交换.【解答】 算法(一) Void exchange ( BiTree root ) p=root; if ( pLChild != NULL |
12、p-RChild != NULL ) temp = p-LChild;p-LChild = pRChild; pRChild = temp; exchange ( pLChild ); exchange ( pRChild ); 算法(二) Void exchange ( BiTree root ) p=root; if ( p-LChild != NULL | p-RChild != NULL ) exchange ( p-LChild ); exchange ( pRChild ); temp = p-LChild;p-LChild = p-RChild; pRChild = temp;
13、第六章 习题解析1试分别画出具有3个结点的树和3个结点的二叉树的所有不同形态。2对题1所得各种形态的二叉树,分别写出前序、中序和后序遍历的序列.3已知一棵度为k的树中有n1个度为1的结点,n2个度为2的结点,,nk个度为k的结点,则该树中有多少个叶子结点?提示:参考 P。116 性质3n=n0 + n1 + + nkB=n1 + 2n2 + 3n3 + + knkn= B + 1 n0 + n1 + + nk = n1 + 2n2 + 3n3 + + knk + 1 n0 = n2 + 2n3 + + (k-1)nk + 14。假设一棵二叉树的先序序列为EBADCFHGIKJ,中序序列为ABC
14、DEFGHIJK,请画出该二叉树。提示:参考 P.1486 已知二叉树有50个叶子结点,则该二叉树的总结点数至少应有多少个?提示:方法1 (1)一个叶子结点,总结点数至多有多少个?结论:可压缩一度结点.(2)满二叉树或完全二叉树具有最少的一度结点(3)可能的最大满二叉树是几层?有多少叶结点?如何增补?2550LChilddata=x) FreeTree(bt-LChild); btLChild=NULL; if (btRChild btRChild-data=x) FreeTree(bt-RChild); btRChild=NULL;DelTree(bt-LChild, x);DelTree(
15、btRChild, x);方法2:(1)先序查找;(2)直接查看当前根结点(3)用指针参数;方法3:(1)先序查找;(2)直接查看当前根结点(3)通过函数值,返回删除后结果;(参示例程序)14分别写函数完成:在先序线索二叉树T中,查找给定结点p在先序序列中的后继。在后序线索二叉树T中,查找给定结点*p在后序序列中的前驱.提示:(1)先查看线索,无线索时用下面规律:(2)结点p在先序序列中的后继为其左子或右子;(3)结点*p在后序序列中的前驱也是其左子或右子。15分别写出算法,实现在中序线索二叉树中查找给定结点p在中序序列中的前驱与后继。(参例题)16编写算法,对一棵以孩子-兄弟链表表示的树统计
16、其叶子的个数.提示:(1)可将孩子-兄弟链表划分为根、首子树、兄弟树,递归处理。(2)可利用返回值,或全局变量。17对以孩子-兄弟链表表示的树编写计算树的深度的算法。18已知二叉树按照二叉链表方式存储,利用栈的基本操作写出后序遍历非递归的算法. (参课本)19设二叉树按二叉链表存放,写算法判别一棵二叉树是否是一棵正则二叉树.正则二叉树是指:在二叉树中不存在子树个数为1的结点.提示:可利用任何递归、非递归遍历算法。20计算二叉树最大宽度的算法。二叉树的最大宽度是指:二叉树所有层中结点个数的最大值。21已知二叉树按照二叉链表方式存储,利用栈的基本操作写出先序遍历非递归形式的算法。22。 证明:给定
17、一棵二叉树的前序序列与中序序列,可唯一确定这棵二叉树;给定一棵二叉树的后序序列与中序序列,可唯一确定这棵二叉树;23. 二叉树按照二叉链表方式存储,编写算法将二叉树左右子树进行交换。实习题1. 问题描述 建立一棵用二叉链表方式存储的二叉树,并对其进行遍历(先序、中序和后序),打印输出遍历结果.基本要求 从键盘接受输入先序序列,以二叉链表作为存储结构,建立二叉树(以先序来建立)并对其进行遍历(先序、中序、后序),然后将遍历结果打印输出。要求采用递归和非递归两种方法实现。测试数据 ABCDEGF(其中表示空格字符) 输出结果为: 先序:ABCDEGF 中序:CBEGDFA 后序:CGBFDBA2已知二叉树按照二叉链表方式存储,编写算法,要求实现二叉树的竖向显示(竖向显示就是二叉树的按层显示).提示:(1)参习题6.20,实现逐层遍历(2)队中保存每个结点的打印位置,其左、右子的距离3如题1要求建立好二叉树,按凹入表形式打印二叉树结构,如图6。34所示。图6。344按凹入表形式打印树形结构,如图6。35所示。提示:参P。129例,用先根遍历。