(1)前序和中序相同 (2)中序和后序相同 (3)前序和后序相同 [提示]:去异存同。
(1)D L R 与L D R 的相同点:D R,如果无 L,则完全相同, 如果无 LR,…。 (2)L D R 与L R D 的相同点:L D,如果无 R,则完全相同。 (3)D L R 与L R D 的相同点:D,如果无 L R,则完全相同。
(如果去D,则为空树)
7. n个结点的K叉树,若用具有k个child域的等长链结点存储树的一个结点,则空的Child域有多少个? [提示]:参考
8.画出与下列已知序列对应的树T:
树的先根次序访问序列为GFKDAIEBCHJ; 树的后根次序访问序列为DIAEKFCJHBG。 [提示]:
(1)先画出对应的二叉树
(2)树的后根序列与对应二叉树的中序序列相同
9.假设用于通讯的电文仅由8个字母组成,字母在电文中出现的频率分别为:
,,,,,,,
(1)请为这8个字母设计哈夫曼编码, (2)求平均编码长度。
10.已知二叉树采用二叉链表存放,要求返回二叉树T的后序序列中的第一个结点的指针,是否可不用递归且不用栈来完成?请简述原因. [提示]:无右子的“左下端”
11. 画出和下列树对应的二叉树:
12.已知二叉树按照二叉链表方式存储,编写算法,计算二叉树中叶子结点的数目。 13.编写递归算法:对于二叉树中每一个元素值为x的结点,删去以它为根的子树,并释放相应的空间。 [提示]:
[方法1]:(1)按先序查找;(2)超前查看子结点(3)按后序释放; void DelSubTree(BiTree *bt, DataType x) {
if ( *bt != NULL && (*bt) ->data==x ) { FreeTree(*bt); *bt =NULL; }
else DelTree( *bt, x)
void DelTree(BiTree bt, DataType x) { if ( bt )
{ if (bt->LChild && bt->LChild->data==x)
{ FreeTree(bt->LChild); bt->LChild=NULL; }
if (bt->RChild && bt->RChild->data==x)
{ FreeTree(bt->RChild); bt->RChild=NULL; }
DelTree(bt->LChild, x); DelTree(bt->RChild, x); }
}
[方法2]:(1)先序查找;(2)直接查看当前根结点(3)用指针参数; [方法3]:(1)先序查找;(2)直接查看当前根结点
(3)通过函数值,返回删除后结果;
(参示例程序)
14.分别写函数完成:在先序线索二叉树T中,查找给定结点*p在先序序列中的后继。在后序线索二叉树T中,查找给定结点*p在后序序列中的前驱。 [提示]:
(1)先查看线索,无线索时用下面规律:
(2)结点*p在先序序列中的后继为其左子或右子; (3)结点*p在后序序列中的前驱也是其左子或右子。
15.分别写出算法,实现在中序线索二叉树中查找给定结点*p在中序序列中的前驱与后继。(参例题)
16.编写算法,对一棵以孩子-兄弟链表表示的树统计其叶子的个数。 [提示]:
(1)可将孩子-兄弟链表划分为根、首子树、兄弟树,递归处理。 (2)可利用返回值,或全局变量。
17.对以孩子-兄弟链表表示的树编写计算树的深度的算法。
18.已知二叉树按照二叉链表方式存储,利用栈的基本操作写出后序遍历非递归的算法。 (参课本)
19.设二叉树按二叉链表存放,写算法判别一棵二叉树是否是一棵正则二叉树。正则二叉树是指:在二叉树中不存在子树个数为1的结点。 [提示]:可利用任何递归、非递归遍历算法。
20.计算二叉树最大宽度的算法。二叉树的最大宽度是指:二叉树所有层中结点个数的最大值。
21.已知二叉树按照二叉链表方式存储,利用栈的基本操作写出先序遍历非递归形式的算法。
22. 证明:给定一棵二叉树的前序序列与中序序列,可唯一确定这棵二叉树;
给定一棵二叉树的后序序列与中序序列,可唯一确定这棵二叉树;
23. 二叉树按照二叉链表方式存储,编写算法将二叉树左右子树进行交换。
实习题
1.
[问题描述] 建立一棵用二叉链表方式存储的二叉树,并对其进行遍历(先序、中序和后序),
打印输出遍历结果。
[基本要求] 从键盘接受输入先序序列,以二叉链表作为存储结构,建立二叉树(以先序来
建立)并对其进行遍历(先序、中序、后序),然后将遍历结果打印输出。要求采用递归和非递归两种方法实现。
[测试数据] ABCффDEфGффFффф(其中ф表示空格字符) 输出结果为: 先序:ABCDEGF 中序:CBEGDFA 后序:CGBFDBA
2.已知二叉树按照二叉链表方式存储,编写算法,要求实现二叉树的竖向显示(竖向显示就是二叉树的按层显示)。 [提示]:
(1)参习题,实现逐层遍历
(2)队中保存每个结点的打印位置,其左、右子的距离
3.如题1要求建立好二叉树,按凹入表形式打印二叉树结构,如图所示。
A
B C
D E
图
A D B C F E 4.按凹入表形式打印树形结构,如图所示。 [提示]:参例,用先根遍历。
A
B C D
E F G 图
A
B E F C G D
第六章 答案
6.1 分别画出具有3个结点的树和3个结点的二叉树的所有不同形态。 【解答】
具有3个结点的树 具有3个结点的二叉树
已知一棵度为k的树中有n1个度为1的结点,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 + 1
已知二叉树有50个叶子结点,则该二叉树的总结点数至少应有多少个? 【解答】n0表示叶子结点数,n2表示度为2的结点数,则n0 = n2+1
所以n2= n0 –1=49,当二叉树中没有度为1的结点时,总结点数n=n0+n2=99
试分别找出满足以下条件的所有二叉树:
(1) 前序序列与中序序列相同;