软件设计师数据结构二真题无答案.docx
《软件设计师数据结构二真题无答案.docx》由会员分享,可在线阅读,更多相关《软件设计师数据结构二真题无答案.docx(27页珍藏版)》请在冰豆网上搜索。
软件设计师数据结构二真题无答案
软件设计师-数据结构
(二)
(总分131,考试时间90分钟)
一、综合知识试题
1.具有n个顶点、e条边的图采用邻接表存储结构,进行深度优先遍历和广度优先遍历运算的时间复杂度均为______。
A.O(n2)
B.O(e2)
C.(n*e)
D.D(n+e)
2.对于长度为,m(m>1)的指定序列,通过初始为空的一个栈、一个队列后,错误的叙述是______。
A.若入栈和入队的序列相同,则出栈序列和出队序列可能相同
B.若入栈和入队的序列相同,则出栈序列和出队序列可以互为逆序
C.入队序列与出队序列关系为1:
1,而入栈序列与出栈序列关系是1:
n(n≥1)
D.入栈序列与出栈序列关系为1:
1,而入队序列与出队序列关系是1:
n(n≥1)
3.下面关于二叉排序树的叙述中,错误的是______。
A.对二叉排序树进行中序遍历,必定得到节点关键字的有序序列
B.依据关键字无序的序列建立二叉排序树,也可能构造出单支树
C.若构造二叉排序树时进行平衡化处理,则根节点的左子树节点数与右子树节点数的差值一定不超过1
D.若构造二叉排序树时进行平衡化处理,则根节点的左子树高度与右子树高度的差值一定不超过1
4.邻接矩阵和邻接表是图(网)的两种基本存储结构,对于具有,n个顶点、e条边的图,______。
A.进行深度优先遍历运算所消耗的时间与采用哪一种存储结构无关
B.进行广度优先遍历运算所消耗的时间与采用哪一种存储结构无关
C.采用邻接表表示图时,查找所有顶点的邻接顶点的时间复杂度为O(n*e)
D.采用邻接矩阵表示图时,查找所有顶点的邻接顶点的时间复杂度为O(n2)
5.用关键字序列10、20、30、40、50构造的二叉树排序(二叉查找树)为______。
6.设有如下所示的下三角矩阵A[0..8,0..8],将该三角矩阵的非零元素(即行下标不小于列下标的所有元素)按行优先压缩存储在数组M[1..m]中,则元素A[i,j](0≤i≤8,j≤i)存储在数组M的______中。
7.______的邻接矩阵是一个对称矩阵。
A.无向图B.AOV网
C.AOE网D.有向图
8.设循环队列Q的定义中有rear和len两个域变量,其中rear表示队尾元素的指针,len表示队列的长度,如下图所示(队列长度为3,队头元素为e)。
设队列的存储空间容量为M,则队头元素的指针为______。
A.(Q.rear+Q.len-1)
B.(Q.rear+Q.len-1+M)%M
C.(Q.rear-Q.len+1)
D.(Q.rear-Q.len+1+M)%M
9.若将某有序树T转换为二叉树T1,则T中节点的后根序列就是T1中节点的 (8) 遍历序列。
例如,下图(a)所示的有序树转化为二叉树后如图(b)所示。
A.先序B.中序
C.后序D.层序
10.下面关于查找运算及查找表的叙述中,错误的是______。
A.哈希表可以动态创建
B.二叉排序树属于动态查找表
C.折半查找要求查找表采用顺序存储结构或循环链表结构
D.顺序查找方法既适用于顺序存储结构,也适用于链表结构
11.下面关于栈和队列的叙述中,错误的是______。
A.栈和队列都是操作受限的线性表
B.队列采用单循环链表存储时,只需设置队尾指针就可使入队和出队操作的时间复杂度都为O
(1)
C.若队列的数据规模n可以确定,则采用顺序存储结构比链式存储结构效率更高
D.利用两个栈可以模拟一个队列的操作,反之亦可
设一个包含N个顶点、E条边的简单有向图采用邻接矩阵存储结构(矩阵元素A[i][j]等于1/0分别表示顶点i与顶点j之间有/无弧),则该矩阵的元素数目为 (11) ,其中非零元素数目为 (12) 。
12.
A.E2
B.N2
C.N2-E2
D.N2+E2
13.
A.NB.N+E
C.ED.N-E
14.栈是一种按“后进先出”原则进行插入和删除操作的数据结构,因此,______必须用栈。
A.实现函数或过程的递归调用及返回处理时B.将一个元素序列进行逆置
C.链表节点的申请和释放D.可执行程序的装入和卸载
已知一个线性表(16,25,35,43,51,62,87,93),采用散列函数H(Key)=Keymod7将元素散列到表长为9的散列表中。
若采用线性探测的开放定址法解决冲突(顺序地探查可用存储单元),则构造的哈希表为 (15) ,在该散列表上进行等概率成功查找的平均查找长度为 (16) (确定为记录在查找表中的位置,需和给定关键字值进行比较的次数的期望值称为查找算法在查找成功时的平均查找长度)。
15.A.012345678
3543165125628793
B.012345678
3543169325516287
C.012345678
3543165125876293
D.012345678
3543165125876293
16.
A.(5*1+2+3+6)/8B.(5*1+2+3+6)/9
C.(8*1)/8D.(8*1)/9
17.单向链表中往往含有一个头节点,该节点不存储数据元素,一般令链表的头指针指向该节点,而该节点指针域的值为第一个元素节点的指针。
以下关于单链表头节点的叙述中,错误的是______。
A.若在头节点中存入链表长度值,则求链表长度运算的时间复杂度为O
(1)
B.在链表的任何一个元素前后进行插入和删除操作可用一致的方式进行处理
C.加入头节点后,代表链表的头指针不因为链表为空而改变
D.加入头节点后,在链表中进行查找运算的时间复杂度为O
(1)
18.某双向链表中的节点如下图所示,删除t所指节点的操作为______。
A.t->prior->next=t->next;t->next->prior=t->prior;
B.t->prior->prior=t->prior,t->next->next=t->next,
C.t->prior->next=t->prior;t->next->prior=t->next;
D.t->prior->prior=t->next;t->next->prior=t->prior;
19.下面关于图(网)的叙述中,正确的是______。
A.连通无向网的最小生成树中,顶点数恰好比边数多1
B.若有向图是强连通的,则其边数至少是顶点数的2倍
C.可以采用AOV网估算工程的工期
D.关键路径是AOE网中源点至汇点的最短路径
20.对以下4个序列用直接插入排序方法由小到大进行排序时,元素比较次数最少的是______。
A.89,27,35,78,41,15
B.27,35,41,16,89,70
C.15,27,46,40,64,85
D.90,80,45,38,30,25
21.广义表中的元素可以是原子,也可以是表,因此广义表的适用存储结构是______。
A.链表B.静态数组
C.动态数组D.散列表
22.若有数组声明a[0..3,0..2,1..4],设编译时为a分配的存储空间首地址为base_a,且每个数组元素占据一个存储单元。
当元素以行为序存放(即按a[0,0,1],a[0,0,2],a[0,0,3],a[0,0,4],a[0,1,1],a[0,1,2],…,a[3,2,4]顺序存储),则数组元素a[2,2,2]在其存储空间中相对base_a的偏移量是______。
A.8B.12
C.33D.48
23.某一维数组中依次存放了数据元素12,23,30,38,41,52,54,76,85,在用折半(二分)查找方法(向上取整)查找元素54时,所经历“比较”运算的数据元素依次为______。
A.41,52,54B.41,76,54
C.41,76,52,54D.41,30,76,54
24.对n个元素的有序表A[1..n]进行二分(折半)查找(除2取商时向下取整),查找元素A[i](1≤i≤n)时,最多于A中的______个元素进行比较。
25.设L为广义表,将head(L)定义为取非空广义表的第一个元素,tail(L)定义为取非空广义表除第一个元素外剩余元素构成的广义表。
若广义表L=((x,y,z),a,(u,t,w)),则从L中取出原子项y的运算是______。
A.head(tail(taiI(L)))
B.tail(head(head(L)))
C.head(tail(head(L)))
D.tail(tail(head(L)))
26.已知一棵度为3的树(一个节点的度是指其子树的数目,树的度是指该树中所有节点的度的最大值)中有5个度为1的节点,4个度为2的节点,2个度为3的节点,那么,该树中的叶子节点数目为______。
A.10B.9
C.8D.7
27.字符串采用链表存储方式时,每个节点存储多个字符有助于提高存储密度。
若采用节点大小相同的链表存储串,则串比较、求子串、串连接、串替换等串的基本运算中,______。
A.进行串的比较运算最不方便B.进行求子串运算最不方便
C.进行串连接最不方便D.进行串替换最不方便
28.______是右图的合法拓扑序列。
A.654321B.123456
C.563421D.564213
29.下面关于二叉树的叙述,正确的是______。
A.完全二叉树的高度h与其节点数n之间存在确定的关系
B.在二叉树的顺序存储和链式存储结构中,完全二叉树更适合采用链式存储结构
C.完全二叉树中一定不存在度为1的节点
D.完全二叉树中必定有偶数个叶子节点
30.某一维数组中依次存放了数据元素15,23,38,47,55,62,88,95,102,123,采用折半(二分)法查找元素95时,依次与______进行了比较。
A.62,88,95B.62,95
C.55,88,95D.55,95
31.若用n个权值构造一棵最优二叉树(哈夫曼树),则该二叉树的结点总数为______。
A.2nB.2n-1
C.2n+1D.2n+2
一个具有m个节点的二叉树,其二叉链表节点(左、右孩子指针分别用left和right表示)中的空指针总数必定为 (6) 个。
为形成中序(先序、后序)线索二叉树,现对该二叉链表所有节点进行如下操作:
若节点p的左孩子指针为空,则将该左指针改为指向p在中序(先序、后序)遍历序列的前驱节点;若p的右孩子指针为空,则将该右指针改为指向p在中序(先序、后序)遍历序列的后继节点。
假设指针s指向中序(先序、后序)线索二叉树中的某节点,则 (7) 。
32.
A.m+2B.m+1
C.mD.m-1
33.
A.s→right指向的节点一定是s所指节点的直接后继节点
B.s→left指向的节点一定是s所指节点的直接前驱节点
C.从s所指节点出发的right链可能构成环
D.s所指节点的left和right指针一定指向不同的节点
34.将一个无序序列中的元素依次插入到一棵______,并进行中序遍历,可得到一个有序序列。
A.完全二叉树B.最小生成树
C.二叉排序树D.最优叉二树
35.对于哈希表,如果将装填因子α定义为表中装入的记录数与表的长度之比,那么向表中加入新记录时,______。
A.α的值随冲突次数的增加而递减B.α越大发生冲突的可能性就越大
C.α等于1时不会再发生冲突D.α低于0.5时不会发生冲突
以下关于快速排序算法的描述中,错误的是 (35) 。
在快速排序过程中,需要设立基准元素并划分序列来进行排序。
若序列由元素12,25,30,45,52,67,85构成,则初始排列为 (36) 时,排序效率最高(令序列的第一个元素为基准元素)。
36.
A.快速排序算法是不稳定的排序算法
B.快速排序算法在最坏情况下的时间复杂度为O(log2n)
C.快速排序算法是一种分治算法
D.当输入数据基本有序时,快速排序算法具有最坏情况下的时间复杂度
37.
A.45,12,30,25,67,52,85
B.85,67,52,45,30,25,12
C.12,25,30,45,52,67,85
D.45,12,25,30,85,67,52
38.下面关于哈夫曼树的叙述中,正确的是______。
A.哈夫曼树一定是完全二叉树
B.哈夫曼树一定是平衡二叉树
C.哈夫曼树中权值最小的两个结点互为兄弟结点
D.哈夫曼树中左孩子结点小于父结点、右孩子结点大于父结点
39.给定一个有n个元素的有序线性表。
若采用顺序存储结构,则在等概率前提下,删除其中的一个元素平均需要移动______个元素。
A.(n+1)/2B.n/2
C.(n-1)/2D.1
已知一个二叉树的先序遍历序列为①、②、③、④、⑤,中序遍历序列为②、①、④、③、⑤,则该二叉树的后序遍历序列为 (29) 。
对于任意一棵二叉树,叙述错误的是 (30) 。
40.
A.②、③、①、⑤、④B.①、②、③、④、⑤
C.②、④、⑤、③、①D.④、⑤、③、②、①
41.
A.由其后序遍历序列和中序遍历序列可以构造该二叉树的先序遍历序列
B.由其先序遍历序列和后序遍历序列可以构造该二叉树的中序遍历序列
C.由其层序遍历序列和中序遍历序列可以构造该二叉树的先序遍历序列
D.由其层序遍历序列和中序遍历序列不能构造该二叉树的后序遍历序列
二、案例分析试题
1.阅读下列说明和C代码,回答问题。
[说明]
堆数据结构定义如下。
对于n个元素的关键字序列a1,a2,…,an,当且仅当满足下列关系时称其为堆。
在一个堆中,若堆顶元素为最大元素,则称为大顶堆;若堆顶元素为最小元素,则称为小顶堆。
堆常用完全二叉树表示,图8.7是一个大顶堆的例子。
堆数据结构常用于优先队列中,以维护由一组元素构成的集合。
对应于两类堆结构,优先队列也有最大优先队列和最小优先队列,其中最大优先队列采用大顶堆,最小优先队列采用小项堆。
以下考虑最大优先队列。
假设现已建好大顶堆A,且已经实现了调整堆的函数heapify(A,n,index)。
下面将C代码中需要完善的3个函数说明如下。
(1)heapMaximum(A):
返回大项堆A中的最大元素。
(2)heapExtractMax(A):
去掉并返回大顶堆A的最大元素,将最后一个元素“提前”到堆顶位置,并将剩余元素调整成大顶堆。
(3)maxHeapInsert(A,key):
把元素key插入到大顶堆A的最后位置,再将A调整成大顶堆。
优先队列采用顺序存储方式,其存储结构定义如下。
#define PARENT(i) i/2
typedef struct array
int*int_array;//优先队列的存储空间首地址
intarray_size;//优先队列的长度
intcapacity;//优先队列存储空间的容量
ARRAY;
[C代码]
(1)函数heapMaximum
intheapMaximum(ARRAY*A)return
(1) ;
(2)函数heapExtractMax
int_heapExtractMax(ARRAY *A)
intmax;
max=A->int_array[0];
(2) ;
A->array_size--;
Heapify(A,A->array_size,0);//将剩余元素调整成大顶堆
returnmax;
)
(3)函数maxHeaplnsert
intmaxHeaplnsert(ARRAY*A,intkey)
inti,*p;
if (A->array-size==A->capacity)//存储空间的容量不够时扩充空间
p=(int*)realloc(A->int array, A->capacity*2*sizeof(int));
if(!
p) return-1;
A->int_array=P;
A->capacity=2*A->capacity;
A->array_size++:
i= (3) ;
while(i>0&& (4) )
A->int_array[i]=A->int_array[PARENT(i)];
i=PARENT(i);
(5) ;
return0;
[问题1]
根据以上说明和C代码,填充C代码中的空
(1)~(5)。
[问题2]
根据以上C代码,函数heapMaximum,heapExtractMax和maxHeaplnsert的时间复杂度的紧致上界分别为 (6) 、 (7) 和 (8) (用O符号表示)。
[问题3]
若将元素10插入到堆A=(15,13,9,5,12,8,7,4,0,6,2,1)中,调用maxHeaplnsert函数进行操作,则新插入的元素在堆A中第 (9) 个位置(从1开始)。
2.阅读下列说明和C代码,回答问题。
[说明]
对有向图进行拓扑排序的方法是:
(1)初始时拓扑序列为空。
(2)任意选择一个入度为0的顶点,将其放入拓扑序列中,同时从图中删除该顶点以及从该顶点出发的弧。
(3)重复
(2),直到不存在入度为0的顶点为止(若所有顶点都进入拓扑序列则完成拓扑排序,否则由于有向图中存在回路无法完成拓扑排序)。
函数int*TopSort(LinkedDigraphG)的功能是对有向图G中的顶点进行拓扑排序,返回拓扑序列中的顶点编号序列,若不能完成拓扑排序,则返回空指针。
其中,图G中的顶点从1开始依次编号,顶点序列为v1,v2,...,vn,图G采用邻接表示,其数据类型定义如下。
#defineMAXVNUM50 /*最大顶点数*/
typedefstructArcNode /*表节点类型*/
intadjvex; /*邻接顶点编号*/
structArcNode*nextarc; /*指示下一个邻接顶点*/
ArcNode;
typedefstructAdjList /*头节点类型*/
charvdata; /*顶点的数据信息*/
ArcNode*firstarc; /*指向邻接表的第一个表结点*/
AdjList;
typedefstructLinkedDigraph /*图的类型*/
intn; /*图中顶点个数*/
AdjList Vhead[MAXVNUM]; /*所有顶点的头结点数组*/
LinkedDigraph;
例如,某有向图G如图8.8所示,其邻接表如图8.9所示。
函数TopSort中用到了队列结构(Queue的定义省略),实现队列基本操作的函数原型如下表所示:
函数原型说明
voidInitQueue(Queue*Q)初始化队列(构造一个空队列)
boolIsEmpty(QueueQ)判断队列是否为空,若是则返回true,否则返回false
voidEnQueue(Queue*Q,inte)元素入队列
voidDeQueue(Queue*Q,int*p)元素出队列
[C代码]
int*TODSort(LinkedDigraphG)
ArcNode*p; /*临时指针,指示表结点*/
QueueQ;/*临时队列,保存入度为0的顶点编号*/
intk=0; /*临时变量,用作数组元素的下标*/
int j=0,w=0; /*临时变量,用作顶点编号*/
int*topOrdert*inDegree;
topOrder=(int*)malloc((G.n+1)*sizeof(int));/*存储拓扑序列中的顶点编号*/
inDegree=(int+)malloc((G.n+l)+sizeof(int))j/*存储图G中各顶点的入度*/
if(!
inDegree || !
topOrder) return NULL;
(1) ;/*构造一个空队列*/
for(j=1;j<=G.n;j++)/*初始化*/
topOrder[j]=0; inDegree[j]=0;
for(j=1;j<=G.n;j++) /*求图G中各顶点的入度*/
for(p=G.Vhead[j].firstarc; p;p=p->nextarc)
inDegree[p-> adjvex] +=1;
for(j=1;j<=G.n;j++) /*将图G中入度为0的顶点保存在队列中*/
if(0==inDegree[j] )EnQueue(&Q,j);
while(!
IsEmpty(Q))
(2) ;/*队头顶点出队列并用w保存该顶点的编号*/
topOrder[k++]=w;
/*将顶点w的所有邻接顶点的入度减1(模拟删除顶点w及从该顶点出发的弧的操作)*/
for(p=G.Vhead[w].firstarc;p;p=p->nextarc)
(3) -=1;
if (0== (4) ) EnQueue(&Q, p->adjvex);
/*for*/
/*while*/
free(inD