单元7练习参考答案.docx
《单元7练习参考答案.docx》由会员分享,可在线阅读,更多相关《单元7练习参考答案.docx(13页珍藏版)》请在冰豆网上搜索。
![单元7练习参考答案.docx](https://file1.bdocx.com/fileroot1/2022-12/29/d9a6ae66-3d3c-44f7-8e4a-44a7da836a8e/d9a6ae66-3d3c-44f7-8e4a-44a7da836a8e1.gif)
单元7练习参考答案
单元练习7
一.判断题(下列各题,正确的请在前面的括号内打√;错误的打╳)
(√)
(1)树结构中每个结点最多只有一个直接前驱。
(ㄨ)
(2)完全二叉树一定是满二查树。
(ㄨ)(3)在中序线索二叉树中,右线索若不为空,则一定指向其双亲。
(√)(4)一棵二叉树中序遍历序列的最后一个结点,必定是该二叉树前序遍历的最后一个结点。
(√)(5)二叉树的前序遍历中,任意一个结点均处于其子女结点的前面。
(√)(6)由二叉树的前序遍历序列和中序遍历序列,可以推导出后序遍历的序列。
(√)(7)在完全二叉树中,若一个结点没有左孩子,则它必然是叶子结点。
二.填空题
(1)在树中,一个结点所拥有的子树数称为该结点的度。
(2)度为零的结点称为叶(或叶子,或终端)结点。
(3)树中结点的最大层次称为树的深度(或高度)。
(4)对于二叉树来说,第i层上至多有2i-1个结点。
(5)深度为h的二叉树至多有2h-1个结点。
(6)由一棵二叉树的前序序列和中序序列可唯一确定这棵二叉树。
(7)有20个结点的完全二叉树,编号为10的结点的父结点的编号是5。
(8)由二叉树的后序和中序遍历序列,可以唯一确定一棵二叉树。
(9)某二叉树的中序遍历序列为:
DEBAC,后序遍历序列为:
EBCAD。
则前序遍历序列为:
DABEC。
(10)设一棵二叉树结点的先序遍历序历为:
ABDECFGH,中序遍历序历为:
DEBAFCHG,则二叉树中叶结点是:
E、F、H。
(11)已知完全二叉树的第8层有8个结点,则其叶结点数是68。
(12)采用二叉链表存储的n个结点的二叉树,一共有2n个指针域。
(13)采用二叉链表存储的n个结点的二叉树,共有空指针n+1个。
(14)前序为A,B,C且后序为C,B,A的二叉树共有4种。
(18)将一棵完全二叉树按层次编号,对于任意一个编号为i的结点,其左孩子结点的编号为:
2*i。
(19)给定如下图所示的二叉树,其前序遍历序列为:
ABEFHCG。
(20)给定如下图所示的二叉树,其层次遍历序列为:
ABCEFGH。
三.选择题
(1)树最适合用来表示(D)。
A.有序数据元素B.无序数据元素
C.元素之间无联系的数据D.元素之间有分支的层次关系
(2)前序为A,B,C的二叉树共有(D)种。
A.2B.3C.4D.5
(3)根据二叉树的定义,具有3个结点的二叉树有(C)种树型。
A.3B.4C.5D.6
(4)在一棵具有五层的满二叉树中,结点的总数为(B)
A.16B.31C.32D.33
(5)具有64个结点的完全二叉树的深度为(C)
A.5B.6C.7D.8
(6)任何一棵二叉树的叶结点在前序、中序、后序遍历序列中的相对次序(A)。
A.不发生改变B.发生改变C.不能确定D.以上都不对
(7)A,B为一棵二叉树上的两个结点,在中序遍历时,A在B前的条件是(C)。
A.A在B右方B.A是B祖先C.A在B左方D.A是B子孙
(8)下列4棵树中,(B)不是完全二叉树。
A.B.C.D.
(9)如右图所示的二叉树,后序遍历的序列是(D)
A.A、B、C、D、E、F、G、H、I
B.A、B、D、H、I、E、C、F、G
C.H、D、I、B、E、A、F、C、G
D.H、I、D、E、B、F、G、C、A
(10)对于下边的二叉树,其中序序列为(A)
A.DBEHAFCGB.DBHEAFCGC.ABDEHCFGD.ABCDEFGH
(11)某二叉树的后序遍历序列为:
DABEC,中序遍历序列为:
DEBAC,则前序遍历序列为(D)。
A.ACBEDB.DECABC.DEABCD.CEDBA
(12)具有n(n>1)个结点的完全二叉树中,结点i(2i>n)的左孩子结点是(D)。
A.2iB.2i+1C.2i-1D.不存在
(若2i<=n,则答案为A)
(13)把一棵树转换为二叉树后,这棵二叉树的形态是(A)。
A.唯一的B.有多种
C.有多种,但根结点都没有左孩子D.有多种,但根结点都没有右孩子
(14)将一棵有100个结点的完全二叉树从上到下,从左到右依次对结点编号,根结点的编号为1,则编号为45的结点的左孩子编号为(B)。
A.46B.47C.90D.91
(15)将一棵有100个结点的完全二叉树从上到下,从左到右依次对结点编号,根结点的编号为1,则编号为49的结点的右孩子编号为(B)。
A.98B.99C.50D.100
(17)下列陈述正确的是(D)。
A.二叉树是度为2的有序树B.二叉树中结点只有一个孩子时无左右之分
C.二叉树中必有度为2的结点D.二叉树中最多只有两棵子树,且有左右子树之分
(20)二叉树的叶结点个数比度为2的结点的个数(C)。
A.无关B.相等C.多一个D.少一个
五.应用题
1.已知一棵二叉树的后序遍历和中序遍历的序列分别为:
A,C,D,B,G,I,H,F,E和A,B,C,D,E,F,G,H,I。
请画出该二叉树,并写出它的前序遍历的序列。
答:
恢复的二叉树为:
其前序遍历的序列为:
EBADCFHGI
2.已知一棵二叉树的前序遍历和中序遍历的序列分别为:
A,B,D,G,H,C,E,F,I和G,D,H,B,A,E,C,I,F。
请画出此二叉树,并写出它的后序遍历的序列。
。
答:
恢复的二叉树为:
其后序遍历的序列为:
GHDBEIFCA
3.已知一棵树的层次遍历的序列为:
ABCDEFGHIJ,中序遍历的序列为:
DBGEHJACIF,请画出该二叉树,并写出它的后序遍历的序列。
解:
后序遍历的序列:
DGJHEBIFCA
7.某二叉树的结点数据采用顺序存储,其结构如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
E
A
F
D
H
C
G
I
B
(1)画出该二叉树(3分)
(2)写出按层次遍历的结点序列(2分)
解:
(1)
(2)层次遍历的结点序列:
EAFDHCGIB
8.某二叉树的存储如下:
1
2
3
4
5
6
7
8
9
10
lchild
0
0
2
3
7
5
8
0
10
1
data
J
H
F
D
B
A
C
E
G
I
rchild
0
0
0
9
4
0
0
0
0
0
其中根结点的指针为6,lchild、rchild分别为结点的左、右孩子的指针域,data为数据域。
(1)画出该二叉树(3分)
(2)写出该树的前序遍历的结点序列(2分)
解:
(1)
(2)前序遍历的结点序列:
ABCEDFHGIJ
六.算法设计题
以二叉链表为存储结构,设二叉树BT结构为:
typedefstructBT
{chardata;
BT*lchild;
BT*rchild;
}BT;
1.求二叉树中的度数为2的结点。
2.求二叉树中值为最大的元素。
3.将二叉树各结点存储到一维数组中。
4.前序输出二叉树中各结点及其结点所在的层号。
5.求二叉树的宽度
6.交换二叉树各结点的左右子树。
7.写出在二叉树中查找值为x的结点在树中层数的算法。
解:
1.求二叉树中的度数为2的结点。
voidcount(BTt)
{if(t)
{if(t->lchild&&t->rchild)
k++;
count(t->lchild);
count(t->rchild);
}
}
2.求二叉树中值为最大的元素。
intmaxnode(BTt,intmax)
{if(t)
{if(t->data>max)
max=t->data;
max=maxnode(t->lchild,max);
max=maxnode(t->rchild,max);
}
}
3.将二叉树各结点存储到一维数组中。
voidcreate(BTt,inta[],inti)
{if(t)
{a[i]=t->data;
create(t->lchild,a,2*i);
create(t->rchild,a,2*i+1);
}
}
4.前序输出二叉树中各结点及其结点所在的层号。
voidpreorderlevel(BTt,inth)//t的层数为h
{if(t!
=NULL)
{printf(“%d,%d”,t->data,h);
preorderlevel(t->lchild,h+1);
preorderlevel(t->rchild,h+1);
}
}
5.求二叉树的宽度
思想:
按层遍历二叉树,采用一个队列q,让根结点入队列,最后出队列,若有左右子树,则左右子树根结点入队列,如此反复,直到队列为空。
intWidth(BT*T)
{intfront=-1,rear=-1;//队列初始化
intflag=0,count=0,p;
//p用于指向树中层的最右边的结点,标志flag记录层中结点数的最大值
if(T!
=NULL)
{rear++;
q[rear]=T;
flag=1;
p=rear;
}
while(front
{front++;
T=q[front];
if(T->lchild!
=NULL)
{rear++;
q[rear]=T->lchild;
count++;
}
if(T->rchild!
=NULL)
{rear++;
q[rear]=T->rchild;
count++;
}
if(front==p)//当前层已遍历完毕
{if(flagflag=count;
count=0;
p=rear; //p指向下一层最右边的结点
}
}//endwhile
return(flag);
}
6.解:
借助栈来进行对换。
Swap(BinTree*T)
{BinTree*stack[100],*temp;
inttop=-1;
root=T;
if(T!
=NULL)
{
top++;
stack[top]=T;
while(top>-1)
{T=stack[top];
top--;
if(T->child!
=NULL||T->rchild!
=NULL)
{//交换结点的左右指针
temp=T->lchild;
T->lchild=T->rchild;
T->rchild=temp;
}
if(T->lchild!
=NULL)
{top++;
stack[top]=T->lchild;
}
if(T->rchild!
=NULL)
{top++;
stack[top]=T->rchild;
}
}
}
}
main()
{intI,j,k,l;
printf(“\n”);
root=CreateBinTree();
Inorder(root);
i=CountNode(root);
j=CountLeafs(root);
k=Depth(root);
l=Width(root);
printf(“\nTheNode’sNumber:
%d”,i);
printf(“\nTheLeafs’sNumber:
%d”,j);
printf(“\nTheDepthis:
%d”,k);
printf(“\nThewidthis:
%d”,l);
Swap(root);
Printf(“\nTheswapTreeis:
”);
Inorder(root);
}
7.解:
inth=-1,lh=1,count=0;charx=’c’;//赋初值
Level(BinTreeT,inth,intlh)//求X结点在树只的层树
{if(T==Null)
h=0;
else
if(T->data==x)
{h=lh;count=h;}
else
{h++;
Level(T->lchild,h,lh);
if(h==-1)
Level(T->rchild,h,lh);
}
}
main()
{BinTree*(*newroot);
Printf(“\n”);
Root=CreateBinTree();
Inorder(root);
Printf(“\n”);
Level(root,h,lh);
Printf(“%d”,count);
}