数据结构考试复习题绝密版副本.docx
《数据结构考试复习题绝密版副本.docx》由会员分享,可在线阅读,更多相关《数据结构考试复习题绝密版副本.docx(18页珍藏版)》请在冰豆网上搜索。
数据结构考试复习题绝密版副本
一、填空题
1、栈和队列的共同点是(只允许在端点处插入和删除元素)。
2、数据的逻辑结构有线性结构和(非线性结构)两大类。
3、在最坏情况下,堆排序需要比较的次数为(O(nlog2n))
4、一棵有n个结点的满二叉树有(0)个度为1的结点、有((n-1)/2)个分支(非终端)结点和((n+1)/2)个叶子,该满二叉树的深度为(log2n+1)。
5、n(n﹥0)个顶点的无向图最多有(n(n-1)/2)条边,最少有0条边。
6、判定一个栈ST(最多元素为m0)为栈满的条件是(top==m0)。
7、头结点是指:
(指向链表中第一个结点(或为头结点或为首元结点)的指针),称为头结点。
8.指出树和二叉树的三个主要差别
①树的结点个数至少为1,而二叉树的结点个数可以为0;
②树种结点的最大读书没有限制,而二叉树结点的最大度数不能超过2;
③树的结点无左右之分,而二叉树的结点有左右之分。
9.从概念上讲,树与二叉树是两种不同的数据结构,将树转化为二叉树的基本目的是(树可采用二叉树的存储结构并利用二叉树的已有算法解决树的有关问题。
)
10.若结点A有三个兄弟(包括A本身),并且B是A的双亲结点,B的度是(4)
11.若一棵具有n个结点的二叉树采用标准链接存储结构,那么该二叉树所有结点共有(n+1)个空指针域。
12.已知二叉树的前序序列为ABDEGCFHIJ,中序序列为DBGEAHFIJC,写出后序序列(DGEBHJIFCA)。
13.已知二叉树的后序序列为FGDBHECA,中序序列为BFDGAEHC,并写出前序序列(ABDEGCEH)。
14.找出满足下列条件的二叉树答案
1)先序和中序遍历,得到的结点访问顺序一样。
(无左子树)
2)后序和中序遍历,得到的结点访问顺序一样。
(无右子树)
3)先序和后序遍历,得到的结点访问顺序一样。
(仅一个结点的二叉树)
15.一棵含有n个结点的k叉树,可能达到的最大深度和最小深度各是多少?
最大n,最小┕log2n┙+1
16.一棵二叉树有67个结点,这些结点的度要么是0,要么是2。
这棵二叉树中度为2的结点有(22)个。
17.含有100个结点的树有(99)条边。
18.一棵哈夫曼树有19个结点,则其叶子结点的个数是(10)。
19.设一棵二叉树结点的先根序列为ABDECFGH,中根序列为DEBAFCHG,则二叉树中叶子结点是(EFH)。
20.己知二维数组A[m][n]采用行序为主方式存储,每个元素占k个存储单元,并且第一个元素的存储地址是LOC(A[0][0]),则A[0][0]的地址是(LOC(A[0][0])+(n*i+j)*k)。
21.二维数组A[10][20]采用列序为主方式存储,每个元素占一个存储单元,并且A[0][0]的存储地址是200,则A[6][12]的地址是(332)。
22.有一个10阶对称矩阵A,采用压缩存储方式(以行序为主,且A[0][0]=1),则A[8][5]的地址是(42)。
23.设n行n列的下三角矩阵A已压缩到一维数组S[1..n*(n+1)/2]中,若按行序为主存储,则A[i][j]对应的S中的存储位置是(i*(i+1)/2+j+1)。
24.若A是按列序为主序进行存储的4×6的二维数组,其每个元素占用3个存储单元,并且A[0][0]的存储地址为1000,元素A[1][3]的存储地址为(1030),该数组共占用(72)个存储单元。
25、算法的五个重要特性是(有穷性),(确定性),(可行性),输入,输出。
26、ADT(AbstractDataType),即称为(抽象数据类型),是指一个数学模型及定义在该模型上的一组操作(运算);ADT只考虑数据的(一组逻辑特性)。
27、在树形结构中,每一个结点可以有多个(后件)结点,它们都称为该结点的(子结点)。
没有(后件)的结点称为(叶子结点)。
二、判断题
1、线性表的逻辑顺序与存储顺序总是一致的。
×
2、拓扑排序是一种内部排序的算法。
×
3、在AOE网中,一定有不止一条关键路径。
×
4、二维数组是其数据元素为线性表的线性表。
√
5、一个栈的输入序列是12345,则输出序列43512是可能的。
×
6、栈和队列是一种非线性数据结构。
(×)
7、数据元素是数据的最小单位。
(×)
8、顺序存储方式只能用于存储线性结构(×)。
9、二叉树中每个结点的两棵子树是有序的。
(√)
10、快速排序是排序算法中平均性能最好的一种排序。
(√)
11.二叉树中任何一个结点的度都是2。
(× )
12.由二叉树结点的先根序列和后根序列可以唯一地确定一棵二叉树。
(√ )
13.一棵哈夫曼树中不存在度为1的结点。
( √ )
14.平衡二叉排序树上任何一个结点的左、右子树的高度之差的绝对值不大于1(√)
15、链表中的头结点仅起到标识的作用。
(×)
16、满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。
(√)
17、健壮的算法不会因非法的输入数据而出现莫名其妙的状态。
(√)
18、一个图按广度优先搜索法遍历的结果是惟一的。
(×)
19、冒泡排序在初始关键字序列为逆序的情况下执行的交换次数最多。
(√)
三、单选题
1、算法分析的两个主要方面是:
A
A)空间复杂性和时间复杂性B)正确性和简明性
C)可读性和文档性D)数据复杂性和程序复杂性
2、一个向量第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是B
A)110B)108C)100D)120
3、在n个结点的顺序表中,算法的时间复杂度是O
(1)的操作是:
A
A)访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n)
B)在第i个结点后插入一个新结点(1≤i≤n)
C)删除第i个结点(1≤i≤n)
D)将n个结点从小到大排序
4、已知指针p和q分别指向某单链表中第一个结点和最后一个结点。
假设指针s指向
另一个单链表中某个结点,则在s所指结点之后插入上述链表应执行的语句为(B)
A)q->next=s->next;s->next=p;B)s->next=p;q->next=s->next;
C)p->next=s->next;s->next=q;D)s->next=q;p->next=s->next;
5、关键路径是事件结点网络中的(A)
A)从源点到汇点的最长路径B)从源点到汇点的最短路径
C)最长的回路D)最短的回路
6、表达式a*(b+c)-d的后缀表达式是(B)
A)abcd*+-B)abc+*d-C)abc*+d-D)-+*abcd
7假设以数组A[m]存放循环队列的元素。
已知队列的长度为length,指针rear指向队
尾元素的下一个存储位置,则队头元素所在的存储位置为(A)
A)(rear-length+m+1)%mB)(rear-length+m)%m
C)(rear-length+m-1)%mD)(rear-length)%m
8、对于长度为9的有序顺序表,若采用折半搜索,在等概率情况下搜索成功的平均搜索长度为(C)。
A)20/9B)18/9C)25/9D)22/9
9、在一棵具有n个结点的二叉树中,所有结点的空子树个数等于(C)
A)nB)n-1C)n+1D)2*n
10、在计算机内实现递归算法时所需的辅助数据结构是(A)
A)栈B)队列C)树D)图
11、线性表采用链式存储结构时,其地址:
(D)。
A)必须是连续的B)部分地址必须是连续的C)一定是不连续的D)连续与否均可以
12、向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动(B)个元素.
A)8B)63.5C)63D)7
13、在计算机中,算法是指(B)
A)加工方法B)解题方案的准确而完整的描述C)排序方法D)查询方法
14、数据结构的三要素是指(B)。
A)数据元素、顺序存储、存储结构B)数据元素、逻辑结构、存储结构
C)顺序存储、链式存储、存储结构D)数据元素、逻辑结构、链式存储
15、判定一个队列QU(最多元素为m)为满队列的条件是:
(A)
A)QU->rear-QU->front==mB)QU->rear-QU->front-1==m
C)QU->front==QU->rearD)QU->front==QU->rear+1
16.二叉树的前序遍历序列中,任意一个结点均处在其子女结点的前面,这种说法(A)
(A)正确(B)错误
17.由于二叉树中每个结点的度最大为2,所以二叉树是一种特殊的树,这种说法B
(A)正确(B)错误
18、设高度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的结点数至少为(B)。
(A)2h(B)2h-1(C)2h+1(D)h+1
19.已知某二叉树的后序遍历序列是dabec。
中序遍历序列是debac,它的前序遍历序列是(D)。
(A)acbed(B)decab(C)deabc(D)cedba
20.如果T2是由有序树T转换而来的二叉树,那么T中结点的前序就是T2中结点的(B)
(A)前序(B)中序(C)后序D.层次序
21.某二叉树的前序遍历结点访问顺序是abdgcefh,中序遍历的结点访问顺序是dgbaechf,则其后序遍历的结点访问顺序是(D)。
(A)bdgcefha(B)gdbecfha(C)bdgaechf(D)gdbehfca
22.二叉树为二叉排序树的充分必要条件是其任一结点的值均大于其左孩子的值、小于其右孩子的值。
这种说法(B)
(A)正确(B)错误
23.按照二叉树的定义,具有3个结点的二叉树有(C)种。
(A)3(B)4(C)5(D)6
24.在一非空二叉树的中序遍历序列中,根结点的右边(A)
(A)只有右子树上的所有结点(B)只有右子树上的部分结点
(C)只有左子树上的部分结点(D)只有左子树上的所有结点
25.树最适合用来表示(C)。
(A)有序数据元素(B)无序数据元素
(C)元素之间具有分支层次关系的数据(D)元素之间无联系的数据
26.任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序(A)
(A)不发生改变(B)发生改变(C)不能确定D.以上都不对
27.实现任意二叉树的后序遍历的非递归算法而不使用栈结构,最佳方案是二叉树采用(A)存储结构。
(A)二叉链表(B)广义表存储结构(C)三叉链表(D)顺序存储结构
28.对一个满二叉树,m个树叶,n个结点,深度为h,则(D)
(A)n=h+m(B)h+m=2n(C)m=h-1(D)n=2h-1
29.如果某二叉树的前序为stuwv,中序为uwtvs,那么该二叉树的后序为(C)
(A)uwvts(B)vwuts(C)wuvts(D)wutsv
30.具有五层结点的二叉平衡树至少有(B)个结点。
(A)10(B)12(C)15(D)17
31、一个有n个顶点的无向图最多有(C)条边。
A)n(n-1)B)n/2C)n(n-1)/2D)(n-1)/2
32、在完全二叉树中,若一个结点是叶结点,则它没(C)。
A)左子结点B)右子结点C)左子结点和右子结点D)左子结点,右子结点和兄弟结点
33、希尔排序属于(D)。
A)交换排序B)归并排序C)选择排序D)插入排序
34、线性表采用链式存储结构时,其地址(D)。
A)必须是连续的B)部分地址必须是连续的
C)一定是不连续的D)连续与否均可以
35、广度优先遍历类似于二叉树的(D)。
A)先序遍历B)中序遍历C)后序遍历D)层次遍历
四、操作题
1、给定二叉树的两种遍历序列,分别是:
前序遍历序列:
D,A,C,E,B,H,F,G,I;中序遍历序列:
D,C,B,E,H,A,G,I,F,试画出该二叉树,并简述由任意二叉树的前序遍历序列和中序遍历序列求二叉树的思想方法。
思想方法:
分析:
先序遍历序列的第一个字符为根结点。
对于中序遍历,根结点在中序遍历序列的中间,左边部分是根结点的左子树的中序遍历序列,右边部分是根结点的右子树的中序遍历序列。
先序:
DACEBHFGI-->D左无ACEBHFGI无左子树
中序:
DCBEHAGIF-->左无DCBEHAGIF
得出结论:
D是树的根结点,无左子树,有右子树
先序:
ACEBHFGI-->ACEBHFGI
中序:
CBEHAGIF-->CBEHAGIF
得出结论:
CEBH是A左子树,FGI是A有右子树
先序:
CEBH-->无左CEBH
中序:
CEBH-->C无左BEH
得出结论:
C无左子树,EBH是A有右子树
先序:
EBH-->EBH
中序:
BEH-->BEH
得出结论:
B是E左子树,H是B右子树
先序:
FGI-->FGI无右
中序:
GIF-->GIF无右
得出结论:
GI是F左子树,F无右子树
先序:
GI-->G无左I
中序:
GI-->无左GI
得出结论:
G无左子树,I为G右子树
综上可得所求二叉树
2、假定用于通信的电文仅由8个字母c1,c2,c3,c4,c5,c6,c7,c8组成,各字母在电文中出现的频率分别为5,25,3,6,10,11,36,4。
试为这8个字母设计不等长Huffman编码,并给出该电文的总码数。
3.如图12所示的带权有向图G,试回答以下问题:
(1)给出从结点v1出发按深度优先搜索遍历G所得的结点序列
(2)给出G的一个拓扑序列
(3)给出从结点v1到结点v8的关键路径。
4.写出对下列数据序列快速排序每一趟结果。
{49,38,65,97,76,13,27,50}
5.假定按以下顺序输入关键字(32,13,49,55,22,39,20),散列地址空间为HT[10],若采用除留余数法构造散列函数H(KEY)=KEY%10和线性探测法处理冲突,试构造该哈希表。
7、有C=(K,R)用二元组表示的数据结构;
其中:
K={1,2,3,4,5,6}
R=(r)
r={<1,2>,<2,3>,<2,4>,<3,4>,<3,5>,<3,6>,<4,5>,<4,6>}
画出它们对应的逻辑图形表示,并指出它属于哪种结构
8、已知L是带表头结点的非空单链表,且P结点既不是首元结点,也不是尾元结点,从下列语句中选择合适的语句序列,以实现删除P结点的直接后继结点功能。
(1)P->NEXT=P->NEXT->NEXT;
(2)P=P->NEXT->NEXT;
(3)WHILE(P->NEXT!
=Q)P=P->NEXT;;
(4)WHILE(P->NEXT->NEXT=Q)P=P->NEXT;
(5)Q=P;
(6)Q=P->NEXT;
(7)P=L;
(8)L=L->NEXT;
(9)Free(Q);
删除P结点的直接后继结点的语句序列是:
9、给定权值集合{15,03,14,02,06,09,16,17},构造相应的霍夫曼树,并计算它的带权外部路径长度。
10、已知下图所示的有向图,请给出该图的:
(1)每个顶点的入/出度;
(2)逆邻接表。
11、写出对下列数据序列希尔排序每一趟结果。
增加量序列取5,3,2,1
{49,38,65,97,76,13,27,49,55,04}
第一趟:
13,27,49,55,4,49,38,65,97,76
第二趟:
13,4,49,38,27,49,55,65,97,76
第三趟:
13,4,27,38,49,49,55,65,97,76
第四趟:
4,13,27,38,49,49,55,65,76,97ABEC##F#DG###
12、给定二叉树的两种遍历序列,前序遍历序列:
ABCDEFG;中序遍历序列:
CDBAEGF;试画出该二叉树的中序线索二叉树。
13、已知一个图的顶点集V和边集E分别为:
V={1,2,3,4,5,6,7};E={(1,2)3,(1,3)5,(1,4)8,(2,5)10,(2,3)6,(3,4)15,(3,5)12,(3,6)9,(4,6)4,(4,7)20,(5,6)18,(6,7)25};
(1)画出该无向图;
(2)用克鲁斯卡尔算法得到最小生成树,试写出在最小生成树中依次得到的各条边。
(1)
(2)(1,2)3,(4,6)4,(1,3)5,(1,4)8,(2,5)10,(4,7)20
14、假设有排序码13,38,65,97,76,49,27,请写出简单选择排序每一趟的结果。
结果:
13386597764927
13276597764938
13273897764965
13273849769765
13273849659776
13273849657697
13273849657697
五、算法设计
1、已知一带头结点单链表L(21,23,34,43,45,54,56,67),编写算法在第三个元素之前插入一个元素88。
算法如下:
voidListInsert(LinkList&L,inti,ElemTypee)
{
LinkListp=L,s;
intj=0;
while(p&&j{
p=p->next;
j++;//这里写++j也没关系,这里主要是利用后插,找到插入位置的前一个位置
}
if(!
p||j>i-1)
return;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;//这下面的两步是最为关键的,没他的话,基本上没有分数,切记!
!
!
!
s->next=p->next;
p->next=s;
}
2、有一单链表,其结点的元素值以非递减有序排列,试设计实现在单链表中删除值相同的多余结点的算法。
算法:
voidListDelte(LinkList&L)
{
LinkListp,s,q;
p=L->next;
while(p!
=NULL&&p->next!
=NULL)
{
s=p;//s指向要删除结点的前趋
q=p->next;
while(q!
=NULL)
{
if(q->data==p->data)//查找值相同的结点并删除
{
s->next=q->next;
q=s->next;
}
else
{
s=q;
q=q->next;
}
}
p=p->next;
}
}
3、已知线性链表L,其头指针为head,编写算法统计数据域为X的结点个数。
算法一:
算法二:
intcount(LinkListL,ElemTypex)
{
LNode*p;
intn=0;
p=L;
while(p!
=NULL)
{
if(p->data==x)n++;
p=p->next;
}
retrunn;
}
4、编写算法,对于输入的任意一个非负十进制数,将其转换输出与其等值的八进制数。
算法:
voidconver(SqStackS)
{
intn,temp;
scanf("%d",&n);
while(n!
=0)
{
Push(S,n%8);
n=n/8;
}
while(StackEmpty(S)==0)
{
temp=Pop(S);
printf("%d",temp);
}
printf("\n");
}
算法二:
voidconversion(SqStackS,intn)
{
InitStack(S);
while(n)
{
push(S,n%8);
n/=8;
}
SElemTypee;
while(!
stackempty(S))
{
pop(S,e);
printf("%d",e);
}
printf("\n");
}
5、有一个带头结点的非递减有序单链表L,头结点指针为head,编写算法向L中插入一个值为x的元素,使插入后仍为非递减有序。
voidLinkInsert(LinkList&L,intn)
{
LinkListp,q,s;
if(!
L->next)
{
L=(LinkList)malloc(sizeof(LNode));
L->data=n;
return;
}
p=L->next;
while(p&&p->data<=n)
{
q=p;
p=p->next;
}
s=(LinkList)malloc(sizeof(LNode));
s->data=n;
s->next=q->next;
q->next=s;
}
6、有一个不带头结点的单链表L(至少有1个结点),第一个结点指针为head,编写算法将L逆置,即最后一个结点变成第一个结点,倒数第二个结点变成第二个结点,如此等等。
voidchange(LinkList&L)
{
LinkListp,s;
p=L;L=NULL;
while(p)
{
s=p;
p=p->next;
s->next=L;
L=s;
}
}