数据结构C语言描述课后答案习题答案6课案.docx
《数据结构C语言描述课后答案习题答案6课案.docx》由会员分享,可在线阅读,更多相关《数据结构C语言描述课后答案习题答案6课案.docx(10页珍藏版)》请在冰豆网上搜索。
![数据结构C语言描述课后答案习题答案6课案.docx](https://file1.bdocx.com/fileroot1/2023-2/13/bc317c45-410b-4d4d-9300-7b4e6f2c6c91/bc317c45-410b-4d4d-9300-7b4e6f2c6c911.gif)
数据结构C语言描述课后答案习题答案6课案
习题6
1)选择题
(1)已知一算术表达式的中序遍历结果为A+B*C-D/E,后序遍历的结果为ABC*+DE/-,其前序遍历的结果为(D)。
A.-A+B*C/DEB.-A+B*CD/E
C.-+*ABC/DED.-+A*BC/DE
(2)在下述结论中,正确的是(D)。
①只有一个结点的二叉树的度为0。
②二叉树的度为2。
③二叉树的左右子树可任意交换。
④深度为K的完全二叉树的结点个数小于或等于深度相同的满二叉树。
A.①②③B.②③④C.②④D.①④
(3)若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是(B)。
A.9B.11C.15D.不确定
(4)设森林F中有三棵树,第一、第二、第三棵树的结点个数分别为M1、M2和M3。
与森林F对应的二叉树根结点的右子树上的结点个数是(D)。
A.M1B.M1+M2C.M3D.M2+M3
(5)具有10个叶子结点的二叉树中有(B)个度为2的结点。
A.8B.9C.10D.11
(6)一棵完全二叉树上有1001个结点,其中叶子结点的个数是(D)。
A.250B.500C.254D.以上答案都不对
(7)有n个叶子结点的哈夫曼树的结点总数为(D)。
A.不确定B.2nC.2n+1D.2n-1
(8)二叉树的第I层上最多含有的结点数为(C)。
A.2IB.2I-1C.2I-1D.2I+1
(9)利用二叉链表存储树,则根结点的右指针是(C)。
A.指向最左孩子B.指向最右孩子C.空D.非空
(10)对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用(C)次序的遍历实现。
A.先序B.中序C.后序D.从根开始按层次遍历
(11)二叉树的先序遍历为EFHIGJK,中序遍历为HFIEJKG,则该二叉树根的右子树的根是(C)。
A.EB.FC.GD.H
(12)在完全二叉树中,若一个结点是叶子结点,则它没有(C)。
A.左子结点B.右子结点
C.左子结点和右子结点D.左子结点、右子结点和兄弟结点
(13)从下列有关树的叙述中,选出5条正确的叙述(CDFHI)。
A.二叉树中每个结点有两个子结点,而树无此限制,因此二叉树是树的特殊情况
B.当k≥1时高度为k的二叉树至多有2k-1个结点
C.用树的前序遍历和中序遍历可以导出树的后序遍历
D.线索二叉树的优点是便于在中序遍历下查找前驱结点和后继结点
E.将一棵树转换成二叉树后,根结点没有左子树
F.一棵含有n个结点的完全二叉树,它的高度是
G.在二叉树中插入结点,该二叉树便不再是二叉树
H.采用二叉树链表作树的存储结构,树的前序遍历和其相应的二叉树的前序遍历的结果一样
I.哈夫曼树是带权路径最短的树,路径上权值较大的结点离根较近
J.用一维数组存储二叉树时,总是以前序遍历存储结点。
2)判断题
(1)二叉树是度为2的有序树。
(×)
(2)完全二叉树一定存在度为1的结点。
(×)
(3)对于有n个结点的二叉树,其高度为
。
(×)
(4)深度为k的二叉树中结点总数≤2k-1。
(√)
(5)二叉树的后序遍历序列与前序遍历序列反映的同样的信息(它们反映的信息不独立)。
(√)
(6)二叉树的遍历结果不是唯一的。
(√)
(7)二叉树的遍历只是为了在应用中找到一种线性次序。
(√)
(8)树可用投影法进行中序遍历。
(×)
(9)一棵树的叶子结点,在前序遍历和后序遍历下,皆以相同的相对位置出现。
(√)
(10)二叉树的前序遍历并不能唯一确定这棵树,但是,如果我们还知道该树的根结点是那一个,则可以确定这棵二叉树。
(×)
(11)一棵树的前序遍历和后序遍历分别与和它对应二叉树的前序遍历和后序遍历是一致的。
(×)
(12)对一棵二叉树进行层次遍历时,应借助于一个栈。
(×)
(13)用树的前序遍历和中序遍历可以导出树的后序遍历。
(×)
(14)采用二叉链表作为存储结构,树的前序遍历和其相应的二叉树的前序遍历的结果是一样的。
(√)
(15)用一维数组存储二叉树时,总是以前序遍历顺序存储结点。
(×)
(16)中序遍历二叉链表存储的二叉树,一般要用堆栈;中序遍历检索二叉树时也必须使用堆栈。
(×)
(17)中序遍历一棵二叉排序树的结点就可得到排好序的结点序列。
(√)
(18)后序线索二叉树是不完善的,要对它进行遍历,还需要使用栈。
(√)
(19)任何二叉树的后序线索树进行后序遍历时都必须用栈。
(×)
(20)任何一棵二叉树都可以不用栈实现前序线索树的前序遍历。
(√)
3)填空题
(1)二叉树由根结点,左子树,右子树三个基本单元组成。
(2)树在计算机内的存储方式有双亲链表表示法,孩子链表表示法,孩子兄弟表示法。
(3)在二叉树中,指针p所指结点为叶子结点的条件是p->lchild==null&&p->rchlid==null。
(4)中缀式a+b*3+4*(c-d)对应的前缀式为++a*b3*4-cd,若a=1,b=2,c=3,d=4,则后缀式db/cc*a-b*+的运算结果为18。
(5)二叉树中某一结点左子树的深度减去右子树的深度称为该结点的平衡因子。
(6)具有256个结点的完全二叉树的深度为9。
(7)已知一棵度为3的树有2个度为1的结点,3个度为2的结点,4个度为3的结点,则该树有12个叶子结点。
(8)深度为k的完全二叉树至少有2k-1个结点,至多有2k-1个结点。
(9)在顺序存储的二叉树中,编号为i和j的两个结点处在同一层的条件是用顺序存储二叉树时,要按完全二叉树的形式存储,非完全二叉树存储时,要加“虚结点”。
设编号为i和j的结点在顺序存储中的下标为s和t,则结点i和j在同一层上的条件是log2s=log2t。
(10)二叉树中某一结点左子树的深度减去右子树的深度称为该结点的平衡因子。
(11)在完全二叉树中,编号为i和j的两个结点处于同一层的条件是log2i=log2j。
(12)一棵有n个结点的满二叉树有0个度为1的结点、有(n-1)/2个分支(非终端)结点和(n+1)/2个叶子结点,该满二叉树的深度为log2n+1。
(13)假设根结点的层数为1,具有n个结点的二叉树的最大高度是n。
(14)在一棵二叉树中,度为零的结点的个数为n0,度为2的结点的个数为n2,则有n0=n2+1。
(15)如果只含根结点的二叉树的高度为0,则高度为k的二叉树的最大结点数为2k+1-1,最小结点数为k+1。
4)解答题
(1)从概念上讲,树、森林和二叉树是三种不同的数据结构,将树、森林转化为二叉树的基本目的是什么?
答:
树的孩子兄弟链表表示法和二叉树二叉链表表示法,本质是一样的,只是解释不同,也就是说树(树是森林的特例,即森林中只有一棵树的特殊情况)可用二叉树唯一表示,并可使用二叉树的一些算法去解决树和森林中的问题。
(2)树和二叉树之间有什么样的区别与联系?
答:
树和二叉树逻辑上都是树形结构,区别有以上题1所述三点。
二叉树不是树的特例。
(3)请分析线性表、树、广义表的主要结构特点,以及相互的差异与关联。
答:
线性表属于约束最强的线性结构,在非空线性表中,只有一个“第一个”元素,也只有一个“最后一个”元素;除第一个元素外,每个元素有唯一前驱;除最后一个元素外,每个元素有唯一后继。
树是一种层次结构,有且只有一个根结点,每个结点可以有多个子女,但只有一个双亲(根无双亲),从这个意义上说存在一(双亲)对多(子女)的关系。
广义表中的元素既可以是原子,也可以是子表,子表可以为它表共享。
从表中套表意义上说,广义表也是层次结构。
从逻辑上讲,树和广义表均属非线性结构。
但在以下意义上,又蜕变为线性结构。
如度为1的树,以及广义表中的元素都是原子时。
另外,广义表从元素之间的关系可看成前驱和后继,也符合线性表,但这时元素有原子,也有子表,即元素并不属于同一数据对象。
(4)设有一棵算术表达式树,用什么方法可以对该树所表示的表达式求值?
答:
方法有二。
一是对该算术表达式(二叉树)进行后序遍历,得到表达式的后序遍历序列,再按后缀表达式求值;二是递归求出左子树表达式的值,再递归求出右子树表达式的值,最后按根结点运算符(+、-、*、/等)进行最后求值。
(5)一棵有n(n>0)个结点的d度树,若用多重链表表示,树中每个结点都有d个链域,则在表示该树的多重链表中有多少个空链域?
为什么?
答:
n(n>0)个结点的d度树共有nd个链域,除根结点外,每个结点均有一个指针所指,故该树的空链域有nd-(n-1)=n(d-1)+1个。
(6)一棵二叉树中的结点的度或为0或为2,则二叉树的枝数为2(n0-1),其中n0是度为0的结点的个数。
证明:
设二叉树度为0和2的结点数及总的结点数分别为n0,n2和n,则
n=n0+n2…
(1)
再设二叉树的分支数为B, 除根结点外,每个结点都有一个分支所指,则
n=B+1…
(2)
度为零的结点是叶子,没有分支,而度为2的结点有两个分支,因此
(2)式可写为
n=2*n2+1……………(3)
由
(1)、(3)得n2=n0-1,代入
(1),并由
(1)和
(2)得B=2*(n0-1)。
证毕。
5)设计题
(1)要求二叉树按二叉链表形式存储。
①写一个建立二叉树的C语言程序。
BiTreeCreat()//建立二叉树的二叉链表形式的存储结构
{
ElemTypex;BiTreebt;
scanf(“%d”,&x);//本题假定结点数据域为整型
if(x==0)bt=null;
elseif(x>0)
{bt=(BiNode*)malloc(sizeof(BiNode));
bt->data=x;bt->lchild=creat();bt->rchild=creat();
}
elseerror(“输入错误”);
return(bt);
}//结束BiTree
②写一个判别给定的二叉树是否是完全二叉树的算法。
注意:
完全二叉树深度为k,具有n个结点的二叉树的每个结点都与深度为k的满二叉树中编号从1至n的结点一一对应。
intJudgeComplete(BiTreebt)//判断二叉树是否是完全二叉树,如是,返回1,否则,返回0
{
inttag=0;
BiTreep=bt,Q[];//Q是队列,元素是二叉树结点指针,容量足够大
if(p==null)return
(1);
QueueInit(Q);
QueueIn(Q,p);//初始化队列,根结点指针入队
while(!
QueueEmpty(Q))
{
p=QueueOut(Q);//出队
if(p->lchild&&!
tag)QueueIn(Q,p->lchild);//左子女入队
else
{
if(p->lchild)return0;//前边已有结点为空,本结点不空
elsetag=1;//首次出现结点为空
}
if(p->rchild&&!
tag)QueueIn(Q,p->rchild);//右子女入队
else
{
if(p->rchild)return0;
elsetag=1;
}
}//while
return1;
}//JudgeComplete
(2)二叉树采用二叉链表存储
①编写计算整个二叉树高度的程序。
intHeight(btrebt)//求二叉树bt的深度
{
inthl,hr;
if(bt==null)return(0);
else
{
hl=Height(bt->lch);
hr=Height(bt->rch);
if(hl>hr)return(hl+1);
elsereturn(hr+1);
}
}
②编写计算二叉树最大宽度的算法(二叉树的最大宽度是指二叉树所有层中结点个数的最大值)。
intWidth(BiTreebt)//求二叉树bt的最大宽度
{
if(bt==null)return(0);//空二叉树宽度为0
else
{
BiTreeQ[];//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