厦门理工数据结构期末复习题7文档格式.docx
《厦门理工数据结构期末复习题7文档格式.docx》由会员分享,可在线阅读,更多相关《厦门理工数据结构期末复习题7文档格式.docx(31页珍藏版)》请在冰豆网上搜索。
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
(16)二叉树按某种顺序线索化后,任一结点均有指向其前驱和后继的线索,这种说法(B)。
A.正确B.错误C.不确定D.都有可能
(17)下列陈述正确的是(D)。
A.二叉树是度为2的有序树B.二叉树中结点只有一个孩子时无左右之分
C.二叉树中必有度为2的结点D.二叉树中最多只有两棵子树,且有左右子树之分
(18)用5个权值{3,2,4,5,1}构造的哈夫曼树的带权路径长度是(B)。
A.32B.33C.34D.15
(先构造哈夫曼树,WPL=(1+2)*3+(3+4+5)*2=33)
(19)在树结构中,若结点B有4个兄弟,A是B的父亲结点,则A的度为为(C)。
A.3B.4C.5D.6
(20)二叉树的叶结点个数比度为2的结点的个数(C)。
A.无关B.相等C.多一个D.少一个
四.简答题
1.已知一棵树边的集合如下,请画出此树,并回答问题。
{(L,M),(L,N),(E,L),(B,E),(B,D),(A,B),(G,J),(G,K),(C,G),(C,F),(H,I),(C,H),(A,C)}
(1)哪个是根结点?
(2)哪些是叶结点?
(3)哪个是G的双亲?
(4)哪些是G的祖先?
(5)哪些是G的孩子?
(6)哪些是E的子孙?
(7)哪些是E的兄弟?
哪些是F的兄弟?
(8)结点B和N的层次各是多少?
(9)树的深度是多少?
(10)以结点C为根的子树的深度是多少?
(11)树的度数是多少?
答:
(1)A是根结点。
(2)叶结点:
M,N,D,J,K,F,I。
(3)G的双亲:
C。
(4)G的祖先:
A,C。
(5)G的孩子:
J,K。
(6)E的子孙:
L,M,N。
(7)E的兄弟:
D;
F的兄弟:
G,H。
(8)结点B的层次为2;
结点N的层次是5。
(9)树的深度是5。
(10)以结点C为根的子树的深度是3。
(11)树的度数是3。
2.设下列二叉树是与某森林对应的二叉树,试回答下列问题。
(1)森林中有几棵树?
(2)每一棵树的根结点分别是什么?
(3)第一棵树有几个结点?
(4)第二棵树有几个结点?
(5)森林中有几个叶结点?
解:
(1)4
(2)A,C,G,K
(3)6
(4)2
(5)7
3.二叉树按中序遍历的结果为:
ABC,试问有几种不同形态的二叉树可以得到这一遍历结果?
并画出这些二叉树。
(1)5种。
(2)
4.分别画出具有3个结点的树和三个结点的二叉树的所有不同形态。
(1)三个结点的树
(2)三个结点的二叉树树
五.应用题
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
4.把下列一般树转换为二叉树
(1)
(2)
(1)
(2)
5.把下列森林转换为二叉树
6.把下列二叉树还原为森林
还原后的二叉树为:
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.某二叉树的存储如下:
lchild
data
J
rchild
其中根结点的指针为6,lchild、rchild分别为结点的左、右孩子的指针域,data为数据域。
(2)写出该树的前序遍历的结点序列(2分)
(1)
(2)前序遍历的结点序列:
ABCEDFHGIJ
9.给定如图所示二叉树T,请画出与其对应的中序线索二叉树。
(1)中序遍历序列:
5540256028083354
(2)中序线索二叉树:
10.画出表达式:
-A+B-C+D的标识符树,并求它们的后缀表达式。
后缀表达式:
0A–B+C–D+
11.画出表达式:
(A+B/C-D)*(E*(F+G))的标识符树,并求它们的后缀表达式。
ABC/+D–EFG+**
12.对于算术表达式(A+B*C/D)*E+F*G,画出标识符树,并求它们的后缀表达式。
ABCD/*+E*FG*+
13.给定一个权集W={4,5,7,8,6,12,18},试画出相应的哈夫曼树,并计算其带权路径长度WPL。
456781218
913
17
25
35
60
WPL=(12+18)*2+(6+7+8)*3+(4+5)*4=159
14.给定一个权集W={3,15,17,14,6,16,9,2},试画出相应的哈夫曼树,并计算其带权路径长度WPL。
解
236914151617
52933
11
20
49
82
WPL=(16+17)*2+(9+14+15)*3+6*4+(2+3)*5=229
15.假设用于通信的电文仅由A、B、C、D、E、F、G8个字母组成,字母在电文中出现的频率分别为7,19,2,6,32,3,21,10。
试为这8个字母设计哈夫曼编码。
以权值:
2、3、6、7、10、19、21、32构造哈夫曼树:
六.算法设计题
以二叉链表为存储结构,设二叉树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);
rchild);
}
2.求二叉树中值为最大的元素。
intmaxnode(BTt,intmax)
{if(t->
data>
max)
max=t->
data;
max=maxnode(t->
lchild,max);
rchild,max);
3.将二叉树各结点存储到一维数组中。
voidcreate(BTt,inta[],inti)
{a[i]=t->
create(t->
lchild,a,2*i);
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);
rchild,h+1);
5.求二叉树的宽度
思想:
按层遍历二叉树,采用一个队列q,让根结点入队列,最后出队列,若有左右子树,则左右子树根结点入队列,如此反复,直到队列为空。
intWidth(BT*T)
{intfront=-1,rear=-1;
//队列初始化
intflag=0,count=0,p;
//p用于指向树中层的最右边的结点,标志flag记录层中结点数的最大值
if(T!
{rear++;
q[rear]=T;
flag=1;
p=rear;
}
while(front<
p)
{front++;
T=q[front];
if(T->
lchild!
q[rear]=T->
lchild;
count++;
rchild!
q[rear]=T->
rchild;
if(front==p)//当前层已遍历完毕
{if(flag<
count)
flag=count;
count=0;
//p指向下一层最右边的结点
}
}//endwhile
return(flag);
}
6.解:
借助栈来进行对换。
Swap(BinTree*T)
{BinTree*stack[100],*temp;
inttop=-1;
root=T;
if(T!
{
top++;
stack[top]=T;
while(top>
-1)
{T=stack[top];
top--;
child!
=NULL||T->
{//交换结点的左右指针
temp=T->
T->
lchild=T->
rchild=temp;
{top++;
stack[top]=T->
}
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);
{BinTree*(*newroot);
Printf(“\n”);
Root=CreateBinTree();
Level(root,h,lh);
Printf(“%d”,count);
模拟考题
一.读程序,写出运行结果
1.二叉树的结构如图所示,试写出执行下列算法后的输出结果:
。
(用大写的英文字母表示,字母之间不要任何间隔符号,最后一个字母后面也不要间隔符号)
{datatypedata;
BT*lchild;
BT*rchild;
voidPreorder(BT*T)
{if(T!
{cout<
<
T->
Preorder(T->
ABCEDFG先序遍历
2.二叉树的结构如图所示,试写出执行下列算法后的输出结果:
//定义结点
intBTD(BT*T)
{intldep,rdep;
if(T==NULL)
return0;
else
{ldep=BTD(T->
rdep=BTD(T->
if(ldep>
rdep)
returnldep+1;
returnrdep+1;
4(求二叉树深度)
3.二叉树的结构如图所示,试写出执行下列算法后,count的值为多少?
intcount=0;
voidLeafnum(BT*T)
{
{if(T->
lchild==NULL&
rchild==NULL)
count++;
Leafnum(T->
3(求叶结点数)(2,3,4改为程序填空)
二.程序填空
1.填空完成二叉树按层次遍历的程序
voidLevelorder(BT*T)//层次遍历
{inti,j;
BT*q[100],*p;
p=T;
if(p!
=NULL)
{i=1;
q[i]=p;
j=2;
while(i!
=j)
{p=q[i];
cout<
p->
data;
if(p->
{q[j]=p->
lchild;
j++;
if(p->
{q[j]=p->
rchild;
i++;
三.应用题
1.将下列二叉树转换为森林。
2.画出和下列二叉树相应的森林。
(根右边的子树肯定是森林,而孩子结点的右子树均为兄弟)
3.某二叉树的结点数据采用顺序存储,其结构如下:
(1)画出该二叉树(2分)
(2)写出结点值为D的父结点及左、右子树(3分)
(2)D的父结点为A
D的左子树为C
D的右子树为空
4.某二叉树的存储如下:
Lchild
Data