高等教育考题解答福建专升本数据结构.docx
《高等教育考题解答福建专升本数据结构.docx》由会员分享,可在线阅读,更多相关《高等教育考题解答福建专升本数据结构.docx(20页珍藏版)》请在冰豆网上搜索。
![高等教育考题解答福建专升本数据结构.docx](https://file1.bdocx.com/fileroot1/2023-2/22/d95811a7-f01f-45af-8613-5d10c010bbc2/d95811a7-f01f-45af-8613-5d10c010bbc21.gif)
高等教育考题解答福建专升本数据结构
06年转升本数据结构考题
一、单项选择题(共12小题,每小题2分,共24分)
1、已知单链表结构为
structnode{
intdata;
structnode*next;
}*p,*q,*r;
删除单链表中结点p(由p指向的结点)后面的结点的操作不正确的是__C__
A、q=p->next;p->next=q->next;
B、p->next=p->next->next;
C、r=p->next;p->next=q->next;
D、q=p->next;r=q->next;p->next=r;
2、若待排序对象序列在排序前已经按照关键字递增排列,则采用__A__比较次数最少。
A、直接插入排序O(n)
B、快速排序O(n2)
C、合并排序
D、简单选择排序O(n2)
3、图的深度优先遍历类似于树的__C__
A、后序遍历
B、层次遍历
C、前序遍历
D、中序遍历
4、求赋权有向图的最短路径常用的算法有___D___
A、Prim算法和Kruskal算法
B、Prim算法和Dijkstra算法
C、Kruskal算法和Dijkstra算法
D、Dijkstra算法和Floyd算法
5、单链表中有n个结点,在其中查找值为x的结点,在查找成功时需要比较的平均次数是___D___。
A、n
B、(n-1)/2
C、n/2
D、(n+1)/2
解答:
查询每个元素需要比较次数之和
查询平均复杂度=----------------------------------------------
元素个数
1+2+3+...+nn+1
=----------------------------=--------
n2
思考:
如果查找不成功,计算结果如何?
6、线性表采用链式存储时,结点的存储地址__B___
A、必须是不连续的
B、连续与否均可
C、必须是连续的
D、和头结点的存储地址项连续
7、一棵非空的二叉树中,设根结点在第0层,在第i层上最多有___D__个结点。
A、2(i+1)
B、2i
C、2(i-1)
D、2i
根层01个
/\
AB层12个
/\/\
ABCD层24个
8、在下列的排序算法中,算法的时间复杂度是O(n*log2n)是___D__。
A、冒泡排序
B、简单选择排序
C、直接插入排序
D、堆排序
9、使用一个栈,每次限制进栈和出栈一个元素。
假设进栈的元素序列依次是a、b、c、d;指出不可能的出栈序列___B____。
A、abcd
B、adbc
C、acbd
D、dcba
解答:
A、push(a)、pop()、push(b)、pop()、push(c)、pop()、push(d)、pop(),
B、没办法
C、push(a)、pop()、push(b)、push(c)、pop()、pop()、push(d)、pop()
D、push(a)、push(b)、push(c)、push(d)、pop()、pop()、pop()、pop()
10、设数组queue[]作为循环队列Q的存储空间,front作为队头指针,rear作为队尾指针,则执行出队操作后其头指针front的值为__A___。
A、front=(front+1)%m
B、front=(front+1)%(m-1)
C、front=(front-1)%m
D、front=front+1
解答:
与方案1、2无关。
11、对图进行广度优先遍历时,通常采用__C__来实现
A、字符串
B、B树
C、队列
E、栈
12、一个有n个结点k叉树,树中所有结点的度数之和是__B__。
A、k+n
B、n-1
C、kn
D、n2
解答:
思路1:
树中结点的度数=结点的儿子数
n个结点k叉树,每个结点最多有k个儿子,叶子没有儿子,因此答案不是k*n。
思路2:
正确的做法:
树中所有结点的度数之和=树中所有边条数,
每一条边指向一个结点,每个结点有一条天线,指向父亲结点,除了根结点之外。
故答案是B,n-1
二、填空题(共8小题,11空,每空2分,共22分)
13、已知二叉树后序列表为CEDBA,中序列表为CBEDA,则它的前序列表为__ABCDE__。
解答:
后序列表为CEDBA,因此根是A,
中序列表为CBEDA,因此根只有左子树CBED,没有右子树
A
/
CEDB后序,根是B
CBED中序,左子树C,右子树ED
A
/
B
/\
CED后序
ED中序
A
/
B
/\
CD
/
E
14、N个结点的有向图,最多有___N*(N-1)_____条边。
15、存储图的最常用方法有两种,它们是___邻接矩阵____和____邻接表____。
16、设有一个闭散列表的容量为m,用线性探测法解决冲突,要插入一个键值,若插入成功,至多要进行______比较。
17、一棵哈夫曼树有29个结点,其叶子的个数是___15____。
解答:
哈夫曼树没有度为1的结点,
叶子数=内结点数+1
结点总数
=叶子数+内结点数
=2*叶子数-1
=2*内结点数+1
18、已知单链表的结点定义为
structnode{
intdata;
structnode*next;
};
在单链表中搜索结点p(由指向的结点)的后继结点的操作是____p=p->next___。
19、已知双链表结点定义为
structnode{
intdata;
structnode*left,*right;
};
双链表中结点的left和right分别指向前驱和后继结点,在双链表中删除结点p(由指向的结点)的操作是:
p->left->right=___p->right______;和p->right->left=___p->left_____。
20、对于队列,只能在__队尾___插入元素,在___队头____删除元素。
三、应用题(共4小题,每小题8分,共32分)
21、对图1所示的树
(1)结点A的度是_____3______。
(2)树的度是______3_____。
(3)画出其转换成相应二叉树的树形
A
/|\
BCD
/\/\
EFGH
/
I
解答:
一般树转换成二叉树步骤:
将父亲管理儿子方式改为
父亲管理大儿子,
大儿子管理二儿子(二儿子变成大儿子的右孩子)
二儿子管理三儿子(三儿子变成二儿子的右孩子)
AABEFCDGIH前
/EFBCIGHDA中
B
/\FEIHGDCBA后
EC
\\
FD
/
G
/\
IH
22、已知参加排序的正整数序列是:
90、70、180、30、520、40、60、80、50、130。
以第一个元素90作为基准元素,根据快速排序算法,写出完成第一趟划分后序列重新排列的情况。
60、70、50、30、80、40、90、520、180、130
23、一次输入如下序列中的各个整数,构造其相应的二叉搜索树,只需要画出最后生成的二叉搜索树的树形。
整数序列是180、160、250、300、170、120、125、290、380。
180
/\
160250
/\\
120170300
\/\
125290380
24、用Prim算法求图2所示的无向带权连通图的最小生成树。
要求依次画出从顶点1出发的最小生成树的生成过程。
1
\
4
1
/\
24
1
/\
23—4
1
/\
23—4
/
5
四、算法设计(共2小题,第25小题10分,第26小题12分,共22分)
25、二叉树以二叉表为存储结构,结点结构的定义如下,请写出一个求二叉树中叶子结点个数的算法。
typedefstructbtnode*btlink;
structbtnode{
TreeItemelement;
btlinkleft;
btlinkright;
}Btnode
解答:
与05年考题不一样
intf(指向树根的指针){//f()计算树中叶子节点的个数
if(指向树根的指针==NULL)return0;
x=f(指向树根的左孩子指针);//左子树中叶节点数;
y=f(指向树根的右孩子指针);//右子树中叶节点数;
if(root->left==NULL&&root->right==NULL)return1;
elsereturnx+y;
/*或者
if(x==0&&y==0)return1;
elsereturnx+y;*/
}
intf(btlinkroot){//f()计算树中叶子节点的个数
if(root==NULL)return0;
x=f(root->left);//左子树中叶节点数;
y=f(root->right);//右子树中叶节点数;
if(x==0&&y==0)return1;
elsereturnx+y;
}
T(n)=1+T(n1)+T(n2)n1+n2=n
=1+1+T(n11)+T(n12)+1+T(n21)+T(n22)n1=n11+n12n2=n21+n22
25、二叉树以二叉表为存储结构,结点结构的定义如下,请写出一个求二叉树的高度算法。
解答:
inth(指向树根的指针){//f()计算树高度
if(指向树根的指针==NULL)return0;
x=h(指向树根的左孩子指针);//左子树高度;
y=h(指向树根的右孩子指针);//右子树高度;
if(x>y)returnx+1;
elsereturny+1;
//return(x>y?
x:
y)+1;
}
26、阅读下列程序,它是在已知的数组a中查找数值为x的元素,如果存在则输出“found”,否则输出“notfound”。
试问它是什么方法实现的?
并请完善程序。
用__________查找法。
#defineN10
voidbs(inta[],intx){
intl,r,m;
l=0;r=N-1;
m=___(l+r)/2______;
while((_____l<=r_______)&&(x!
=a[m])){
if(x>a[m])l=_____m+1______;
elser=m-1;
m=(l+r)/2;
}
if(___l<=r____)
printf("notfound");
else
printf("found");
}
main(){
inta[N]={10,20,30,40,50,60,70,80,90,100};
intx;
printf("inputx:
=");
scanf("%d",&x);
bs(____a,x_______);
}
05专升本数据结构考题
一、单选题:
(每题2分,共24分)
1、双向链表的一个结点有(B)个指针。
A、1B、2C、0D、3
2、在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个结点从小到大排序
3、在队列中存取数据的原则是(A)。
A、先进先出B、后进后出?
C、先进后出D、不进不出
4、在栈中,出栈操作的时间复杂度为(A)。
A、O
(1)B、O(logn)
C、O(n)D、O(n*n)
5、设长度为n的链队列用单循环链表表示,若只设头指针,则人队操作的时间复杂度为(C)。
A、O
(1)B、0(logn)
C、0(n)D、O(n*n)
6、如果二叉树的叶结点数为n0,则具有双分支的结点数n2等于(D)。
A、nO+lB、n0
C、2*n0D、n0-1
7、一棵二叉树满足下列条件:
对任一结点,若存在左、右子树,则其值都小于它的左子树上所有结点的值,而大于右子树上所有结点的值。
现采用(B)遍历方式就可以得到这棵二叉树所有结点的递增序列。
A、先根B、中根
C、后根D、层次
8、用邻接表表示图进行深度优先遍历时,其非递归算法通常采用(A)来实现算法。
A、栈B、队列
C、树D、图
9、广度优先遍历类似于二叉树的(D)。
A、先序遍历B、中序遍历
C、后序遍历D、层次遍历
10、在一个有向图中,所有顶点的人度之和等于所有顶点的出度
之和的(B)。
A、1/2倍B、1倍
C、2倍D、4倍
11、任何一个带权无向连通图的最小生成树(B)。
A、只有一棵B、一棵或多棵
C、一定有多棵D、可能不存在
12、设非空单链表的数据域为data,指针域为next,指针P指向单链表的第i个结点,s指向生成的新结点,现将s结点插入到单链表中,使其成为第i结点,下列算法段能正确完成上述要求的是(C)。
A、s->next=p->;p->next=s
B、p->next=s;s->next=p->next;
C、S->next=p->next;p->next=s;交换p->data和s->data
D、p=s;s->next=p
二、填空题(每空2分,共20分)
1、数据的逻辑结构反映_____成分数据逻辑关系______。
2、对于队列,只能在___队尾_____插入元素,在____队头_____删除元素。
3、算法是一运算序列,它应有:
有限性、____确定性____、可行性、可以无任何输入,但必须___有输出____。
4、由一棵二叉树的前序序列和____中序序列____可唯一确定这棵二叉树的结构。
5、如果图的存储结构用____邻接表/邻接矩阵___表示,从某指定顶点作为初始点进行广度优先搜索,得到的广度优先搜索序列唯一。
6、用Dijkstra算法求某一顶点到其余各顶点间的最短路径是按路径长度____递增___的次序来得到最短路径的。
7、线性表(a1,a2,a3,……an)(n>=1)中,每个元素占c个存储单元,m为a1首地址,则按顺序存储方式存储线性表,ai存储地址是_____m+(i-1)*c___。
8、n个结点的无向图,最多有___n*(n-1)/2__条边。
三、应用题(本大题共4小题,每小题8分,共32分)
1、用Prim算法求下图连通的带权图的最小代价生成树,在算法执行的某一刻,已选取的顶点集合U=[1,2,3],边的集合TE=[(1,2),(2,3)],要选取下一条权值最小的边,应当从哪些边中选择?
2、若用插入排序方法对线性表(25,84,21,47,]5,27,68,35,20)进行排序时,请给出前四趟排序结点序列的变化情况。
答:
25
2584
212584
21254784
3、已知一棵二叉树的中序序列和后序序列分别为BDCEAFHG和DECBHGFA,请画出该二叉树。
A
/\
BDCEFHG中
DECBHGF后
4、设将整数a,b,c,d依次进栈,请回答:
若入、出栈次序为
Push(a),Pop(),Push(b),Push(c),Pop(),Push(d),Pop(),
则出栈的字符序列是什么?
答:
acd
四、算法设计(本大题共3小题,每小题8分,共24分)
1、二叉树以二叉链表为存储结构,类型声明如下,请写出一个求二叉树中结点个数的算法。
typedefstructnode{
datatypedata;
structnode*Lchild;
structnode*Rchild;
}BinaTree;
答:
intf(BinaTree*t){
if(t==NULL)return;
else
returnf(t->left)+f(t->right)+1;
}
2、设线性表用顺序结构实现,声明如下:
typedefstructsqlist{
chardata[maxsize];
intn;
}Sqlist;
请写一个算法,判断其是否回文?
(顺读与倒读
一样如:
“ababbaba"为回文)
答:
解法1:
形参和实参直接传递结构变量
#include
#defineMAXLENGTH100
typedefstructsqlist{
chardata[MAXLENGTH];
intn;
}Sqlist;
voidf(Sqlista){
inti;
if(a.n<=0)return;
for(i=0;i<(a.n)/2;i++){
if(a.data[i]!
=a.data[a.n-i]){
printf("No");
return;
}
printf("Yes");
}
}
voidmain(){
Sqlists;
printf("输入n:
");
scanf("%d",&s.n);
printf("输入字符串:
");
scanf("%s",s.data);
f(s);
}
解法2:
形参是指针变量,实参是结构变量地址值
voidf(Sqlist*a){
inti;
if(a->n<=0)return;
for(i=0;i<(a->n)/2;i++)
if(a->data[i]!
=a->data[a->n-i-1]){
printf("No");
return;
}
printf("Yes");
}
voidmain(){
Sqlists;
printf("inputn:
");
scanf("%d",&(s.n));
printf("inputdata:
");
scanf("%s",s.data);
f(&s);
}
解法3:
类似解法2,为指针变量定义了类型List
#include
#defineMAXLENGTH100
typedefstructsqlist*List;
typedefstructsqlist{
chardata[MAXLENGTH];
intn;
}Sqlist;
voidf(Lista){
inti;
if(a->n<=0)return;
for(i=0;i<(a->n)/2;i++)
if(a->data[i]!
=a->data[a->n-i-1]){
printf("No");
return;
}
printf("Yes");
}
voidmain(){
Sqlists;
printf("inputn:
");
scanf("%d",&(s.n));
printf("inputdata:
");
scanf("%s",s.data);
f(&s);
}
3、阅读下列程序,判断它是用什么方法实现排序(升序)的?
并完善下列程序。
#include
voidbubble(int[],int);
main(){
intarray[]={55,2,6,4,32,12,9,73,26,37};
intsize=sizeof(array)/sizeof(int);
bubble(_array,10___);
}
voidbubble(inta[],intsize){
inti,temp;
intend_____=0__________;
intpass=1;
//=======================
while(!
end&&passend=1;
for(i=0,iif(—a[i]>a[i+1]—){
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
end=___0__________;
}
__pass++__________________;
}
//=======================
for(i=0;iprintf("%d",a[i]);
}