目录

第5章  树和二叉树

一、选择题

二、应用题

(1)试找出满足下列条件的二叉树

(2)设一棵二叉树的先序序列: A B D F C E G H ,中序序列: B F D A G E H C

(3) 假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10。

(4)已知下列字符A、B、C、D、E、F、G的权值分别为3、12、7、4、2、8,11,试填写出其对应哈夫曼树HT的存储结构的初态和终态。

三、算法设计题

以二叉链表作为二叉树的存储结构,编写以下算法:

(1)统计二叉树的叶结点个数。

(2)判别两棵树是否相等。

(3)交换二叉树每个结点的左孩子和右孩子。

(4)设计二叉树的双序遍历算法(双序遍历是指对于二叉树的每一个结点来说,先访问这个结点,再按双序遍历它的左子树,然后再一次访问这个结点,接下来按双序遍历它的右子树)。

(5)计算二叉树最大的宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值)。

(6)用按层次顺序遍历二叉树的方法,统计树中具有度为1的结点数目。

(7)求任意二叉树中第一条最长的路径长度,并输出此路径上各结点的值。

(8)输出二叉树中从每个叶子结点到根结点的路径。

第5章  树和二叉树

一、选择题

(1)把一棵树转换为二叉树后,这棵二叉树的形态是(   )。

A.唯一的                          B.有多种

C.有多种,但根结点都没有左孩子    D.有多种,但根结点都没有右孩子

(2)由3 个结点可以构造出多少种不同的二叉树?(    )

A.2          B.3             C.4          D.5

(3)一棵完全二叉树上有1001个结点,其中叶子结点的个数是(  )。

A.250         B. 500          C.254        D.501

(4)一个具有1025个结点的二叉树的高h为(  )。

A.11          B.10             C.11至1025之间       D.10至1024之间

(5)深度为h的满m叉树的第k层有(  )个结点。(1=<k=<h)

A.mk-1          B.mk-1            C.mh-1        D.mh-1

(6)利用二叉链表存储树,则根结点的右指针是(  )。

A.指向最左孩子        B.指向最右孩子         C.空        D.非空

(7)对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用(  )遍历实现编号。

A.先序         B. 中序           C. 后序       D. 从根开始按层次遍历

(8)若二叉树采用二叉链表存储结构,要交换其所有分支结点左、右子树的位置,利用(  )遍历方法最合适。

A.前序         B.中序            C.后序      D.按层次

(9)在下列存储形式中,(  )不是树的存储形式?

A.双亲表示法   B.孩子链表表示法   C.孩子兄弟表示法   D.顺序存储表示法

(10)一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足(  )。

A.所有的结点均无左孩子        B.所有的结点均无右孩子

C.只有一个叶子结点            D.是任意一棵二叉树

(11)某二叉树的前序序列和后序序列正好相反,则该二叉树一定是(  )的二叉树。

A.空或只有一个结点            B.任一结点无左子树

C.高度等于其结点数            D.任一结点无右子树

(12)若X是二叉中序线索树中一个有左孩子的结点,且X不为根,则X的前驱为(  )。

A.X的双亲                      B.X的右子树中最左的结点

C.X的左子树中最右结点          D.X的左子树中最右叶结点

(13)引入二叉线索树的目的是(  )。

A.加快查找结点的前驱或后继的速度    B.为了能在二叉树中方便的进行插入与删除

C.为了能方便的找到双亲              D.使二叉树的遍历结果唯一

(14)线索二叉树是一种(  )结构。

A.逻辑         B. 逻辑和存储          C.物理            D.线性

(15)设F是一个森林,B是由F变换得的二叉树。若F中有n个非终端结点,则B中右指针域为空的结点有(  )个。

A. n-1          B.n                    C. n+1           D. n+2

二、应用题

(1)试找出满足下列条件的二叉树

① 先序序列与后序序列相同    ②中序序列与后序序列相同

③ 先序序列与中序序列相同    ④中序序列与层次遍历序列相同

先序遍历二叉树的顺序是“根—左子树—右子树”,中序遍历“左子树—根—右子树”,后序遍历顺序是:“左子树—右子树―根",根据以上原则,本题解答如下:

(1)  若先序序列与后序序列相同,则或为空树,或为只有根结点的二叉树

(2)  若中序序列与后序序列相同,则或为空树,或为任一结点至多只有左子树的二叉树.

(3)  若先序序列与中序序列相同,则或为空树,或为任一结点至多只有右子树的二叉树.

(4)  若中序序列与层次遍历序列相同,则或为空树,或为任一结点至多只有右子树的二叉树

(2)设一棵二叉树的先序序列: A B D F C E G H ,中序序列: B F D A G E H C

①画出这棵二叉树。

②画出这棵二叉树的后序线索树。

③将这棵二叉树转换成对应的树(或森林)

(3) 假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10。

① 试为这8个字母设计赫夫曼编码。

② 试设计另一种由二进制表示的等长编码方案。

③ 对于上述实例,比较两种方案的优缺点。

解:方案1;哈夫曼编码

先将概率放大100倍,以方便构造哈夫曼树。

 w={7,19,2,6,32,3,21,10},按哈夫曼规则:【[(2,3),6], (7,10)】, ……19, 21, 32

方案1的WPL=2(0.19+0.32+0.21)+4(0.07+0.06+0.10)+5(0.02+0.03)=1.44+0.92+0.25=2.61

方案2的WPL=3(0.19+0.32+0.21+0.07+0.06+0.10+0.02+0.03)=3

结论:哈夫曼编码优于等长二进制编码

字母编号

对应编码

出现频率

1

1100

0.07

2

00

0.19

3

11110

0.02

4

1110

0.06

5

10

0.32

6

11111

0.03

7

01

0.21

8

1101

0.10

(100)

(40)      (60)

19     21     32   (28)

  1. (11)

   7     10  6    (5)

                 2     3

方案比较:

字母编号

对应编码

出现频率

1

000

0.07

2

001

0.19

3

010

0.02

4

011

0.06

5

100

0.32

6

101

0.03

7

110

0.21

8

111

0.10

方案1的WPL=2(0.19+0.32+0.21)+4(0.07+0.06+0.10)+5(0.02+0.03)=1.44+0.92+0.25=2.61

方案2的WPL=3(0.19+0.32+0.21+0.07+0.06+0.10+0.02+0.03)=3

结论:哈夫曼编码优于等长二进制编码

(4)已知下列字符A、B、C、D、E、F、G的权值分别为3、12、7、4、2、8,11,试填写出其对应哈夫曼树HT的存储结构的初态和终态。

初态:

weight

parent

lchild

rchild

1

3

0

0

0

2

12

0

0

0

3

7

0

0

0

4

4

0

0

0

5

2

0

0

0

6

8

0

0

0

7

11

0

0

0

8

0

0

0

9

0

0

0

10

0

0

0

11

0

0

0

12

0

0

0

13

0

0

0

终态

weight

parent

lchild

rchild

1

3

8

0

0

2

12

12

0

0

3

7

10

0

0

4

4

9

0

0

5

2

8

0

0

6

8

10

0

0

7

11

11

0

0

8

5

9

5

1

9

9

11

4

8

10

15

12

3

6

11

20

13

9

7

12

27

13

2

10

13

47

0

11

12

三、算法设计题

以二叉链表作为二叉树的存储结构,编写以下算法:

(1)统计二叉树的叶结点个数。

int LeafNodeCount(BiTree T)

{

if(T==NULL)

return 0;                                //如果是空树,则叶子结点个数为0

else if(T->lchild==NULL&&T->rchild==NULL)

return 1;                                //判断该结点是否是叶子结点(左孩子右孩子都为空),若是则返回1

else

return LeafNodeCount(T->lchild)+LeafNodeCount(T->rchild);

}

(2)判别两棵树是否相等。

(3)交换二叉树每个结点的左孩子和右孩子。

void ChangeLR(BiTree &T)

{

BiTree temp;

if(T->lchild==NULL&&T->rchild==NULL)

return;

else

{

temp = T->lchild;

T->lchild = T->rchild;

T->rchild = temp;

}

ChangeLR(T->lchild);

ChangeLR(T->rchild);

}

(4)设计二叉树的双序遍历算法(双序遍历是指对于二叉树的每一个结点来说,先访问这个结点,再按双序遍历它的左子树,然后再一次访问这个结点,接下来按双序遍历它的右子树)。

void DoubleTraverse(BiTree T)

{

if(T == NULL)

return;

else if(T->lchild==NULL&&T->rchild==NULL)

cout<<T->data;

else

{

cout<<T->data;

DoubleTraverse(T->lchild);

cout<<T->data;

DoubleTraverse(T->rchild);

}

}

(5)计算二叉树最大的宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值)。

[题目分析] 求二叉树高度的算法见上题。求最大宽度可采用层次遍历的方法,记下各层结点数,每层遍历完毕,若结点数大于原先最大宽度,则修改最大宽度。

int Width(BiTree bt)//求二叉树bt的最大宽度

{if (bt==null) return (0);  //空二叉树宽度为0

else

{BiTree Q[];//Q是队列,元素为二叉树结点指针,容量足够大

front=1;rear=1;last=1;//front队头指针,rear队尾指针,last同层最右结点在队列中的位置

temp=0; maxw=0;       //temp记局部宽度, maxw记最大宽度

Q[rear]=bt;           //根结点入队列

while(front<=last)

{p=Q[front++]; temp++; //同层元素数加1

if (p->lchild!=null)  Q[++rear]=p->lchild;   //左子女入队

if (p->rchild!=null)  Q[++rear]=p->rchild;   //右子女入队

if (front>last)      //一层结束,

{last=rear;

if(temp>maxw) maxw=temp;//last指向下层最右元素, 更新当前最大宽度

temp=0;

}//if

}//while

return (maxw);

}//结束width

(6)用按层次顺序遍历二叉树的方法,统计树中具有度为1的结点数目。

int Level(BiTree bt) //层次遍历二叉树,并统计度为1的结点的个数

{int num=0; //num统计度为1的结点的个数

if(bt){QueueInit(Q); QueueIn(Q,bt);//Q是以二叉树结点指针为元素的队列

while(!QueueEmpty(Q))

{p=QueueOut(Q); printf(p->data);     //出队,访问结点

if(p->lchild && !p->rchild ||!p->lchild && p->rchild)num++;//度为1的结点

if(p->lchild) QueueIn(Q,p->lchild); //非空左子女入队

if(p->rchild) QueueIn(Q,p->rchild); //非空右子女入队

}  }//if(bt)

return(num); }//返回度为1的结点的个数

(7)求任意二叉树中第一条最长的路径长度,并输出此路径上各结点的值。

[题目分析]因为后序遍历栈中保留当前结点的祖先的信息,用一变量保存栈的最高栈顶指针,每当退栈时,栈顶指针高于保存最高栈顶指针的值时,则将该栈倒入辅助栈中,辅助栈始终保存最长路径长度上的结点,直至后序遍历完毕,则辅助栈中内容即为所求。

void LongestPath(BiTree bt)//求二叉树中的第一条最长路径长度

{BiTree p=bt,l[],s[]; //l, s是栈,元素是二叉树结点指针,l中保留当前最长路径中的结点

int i,top=0,tag[],longest=0;

while(p || top>0)

{ while(p) {s[++top]=p;tag[top]=0; p=p->Lc;} //沿左分枝向下

if(tag[top]==1)    //当前结点的右分枝已遍历

{if(!s[top]->Lc && !s[top]->Rc)  //只有到叶子结点时,才查看路径长度

if(top>longest) {for(i=1;i<=top;i++) l[i]=s[i]; longest=top; top--;}

//保留当前最长路径到l栈,记住最高栈顶指针,退栈

}

else if(top>0) {tag[top]=1; p=s[top].Rc;}   //沿右子分枝向下

}//while(p!=null||top>0)

}//结束LongestPath

(8)输出二叉树中从每个叶子结点到根结点的路径。

[题目分析]采用先序遍历的递归方法,当找到叶子结点*b时,由于*b叶子结点尚未添加到path中,因此在输出路径时还需输出b->data值。对应的递归算法如下:

void AllPath(BTNode *b,ElemType path[],int pathlen)

{

int i;

if (b!=NULL)

{

if (b->lchild==NULL && b->rchild==NULL) //*b为叶子结点

{

cout << " " << b->data << "到根结点路径:" << b->data;

for (i=pathlen-1;i>=0;i--)

cout << endl;

}

else

{

path[pathlen]=b->data;           //将当前结点放入路径中

pathlen++;                       //路径长度增1

AllPath(b->lchild,path,pathlen); //递归扫描左子树

AllPath(b->rchild,path,pathlen); //递归扫描右子树

pathlen--;                       //恢复环境

}

}

}

数据结构(C语言第2版) 课后习题答案之第五章 树和二叉树相关推荐

  1. 数据结构(C语言第2版) 课后习题答案之 第六章 图

    目录 第六章 图 1.选择题 2.应用题 (1)已知如下图所示的有向图,请给出: (2)已知如图6.28所示的无向网,请给出:          ​ (3)已知图的邻接矩阵如6.29所示.试分别画出自 ...

  2. 数据结构(C语言第2版) 课后习题答案之第四章 串、数组和广义表

    目录 第4章  串.数组和广义表 1.选择题 (1)串是一种特殊的线性表,其特殊性体现在(  ). (2)串下面关于串的的叙述中,(  )是不正确的? (3)串"ababaaababaa&q ...

  3. 谢希仁计算机网络第五版课后习题答案(1~6章)

    计算机网络课后习题答案 第一章   概述 1 第二章   物理层 4 第三章   数据链路层 7 第四章   网络层 11 第五章   传输层 19 第六章   应用层 24 第一章   概述 1-0 ...

  4. 《明解C语言》笔记及课后习题答案 【第四章】

    练习4-1 /*---改写判断整数型符号的程序,使其可以重复输入和输出---*/ #include <stdio.h>int main(void) {int a, retry;do {pr ...

  5. 《明解C语言》笔记及课后习题答案 【第十一章】

    练习11-1 /*---将代码清单进行修改---*/#include <stdio.h>int main(void) {char *p = "123";printf(& ...

  6. 材料力学c语言程序,材料力学(I)五版课后习题答案完整版.pdf

    材料力学(I)五版课后习题答案完整版 第二章 轴向拉伸和压缩 第二章 轴向拉伸和压缩 第第二二章章 轴轴向向拉拉伸伸和和压压缩缩 2-1 试求图示各杆1-1和2-2横截面上的轴力,并作轴力图. 解 解 ...

  7. 朱善利《微观经济学》第3版课后习题答案

    完整版在线阅读>>> http://wwxx.100xuexi.com/Ebook/4459.html 本书是朱善利<微观经济学>(第3版)教材的学习辅导书,对朱善利&l ...

  8. 计算机操作系统英文版课后答案,计算机操作系统(第3版)课后习题答案(完整版)...

    内容简介: 计算机操作系统(第3版)课后习题答案(完整版) 第一章 1.设计现代OS的主要目标是什么? 答:(1)有效性 (2)方便性 (3)可扩充性 (4)开放性 2.OS的作用可表现在哪几个方面? ...

  9. c语言二分答案最小值,C语言程序设计第2版课后习题答案(贾宗璞许合利人民邮电-第2版).doc...

    C语言程序设计第2版课后习题答案(贾宗璞许合利人民邮电-第2版) C语言习题答案 第1章 1.选择题 (1) C (2) B (3) 2.填空题 (1)main (2) main (3) 有穷性.确定 ...

最新文章

  1. ASP.NET AJAX环境的简单构建(ZT)
  2. 第一次运行Spring Boot有感
  3. mysql用sql语句怎么做个脚本备份_mysql备份脚本
  4. ediplus 复制编辑一列_EditPlus等编辑器选中列(块)的方法
  5. 深入理解DOM节点关系
  6. 01 | 从神经元说起:数学篇
  7. 【华为云技术分享】云小课 | 如何通过虚拟私有云保障服务安全
  8. 将Visual Studio Code和Windows Subsystem for Linux一起使用
  9. 局域网arp欺骗病毒查找预防方法(1)
  10. Java 类目树形结构查询
  11. 语句覆盖、条件覆盖、判定覆盖、条件-判定覆盖、组合覆盖、路径覆盖
  12. Acwing 187. 导弹防御系统
  13. 硬盘的修复(二)电脑引导出错的维护
  14. [CnPeng说]低代码并不Low
  15. python xlrd 错误:xlrd.biffh.XLRDError: Unsupported format, or corrupt file: Expected BOF reco
  16. mysql 1045 远程_启用远程mysql连接:错误1045(28000):拒绝用户访问
  17. Linux文件类型与属性
  18. 互联网IT就业市场,你要说最有市场的一定是它,linux内核视频教程全套
  19. 7:第三章:电商工程分析:2:电商工程业务解读与微服务拆分;
  20. 面试笔试算法-二分专题

热门文章

  1. Java实现服务器和客户端简单通信
  2. 工业故事:奇瑞的故事(转载)
  3. 2023年天津专升本招生实施政策
  4. 基于HTML(服装商城)电商项目项目的设计与实现(html前端源码和论文设计)
  5. 智能数据可视化-雷达图的使用方法
  6. 关于高斯光学的一些知识
  7. potplayer 多个进程_搞懂进程组、会话、控制终端关系,才能明白守护进程干嘛的?...
  8. 广州高新技术企业补贴政策汇总及认定标准是什么,补贴20-100万
  9. 让 new bing 使用 GPT-4 编写一个令人满意的程序全过程赏析
  10. Apollo星火计划学习笔记——Apollo开放空间规划算法原理与实践