青岛大学2020年硕士研究生入学考试试题科目代码:910 科目名称:数据结构请考生写明题号,将答案全部写在答题纸上,写在试卷上无效。
一.单项选择题(本大题共20道小题,每小题2分,共40分)1.数据结构是指____()A.一种数据结构B.数据的存储结构C.一组性质相同的数据元素的集合D.相互之间存在一种或多种特定关系的数据元素的集合2.void fun(int n){int i =1;while(i<=n)i++;}该函数的时间复杂度是()A.O(1)B. O(n)C.O(n2)D.O(logn)3.用一个高效的算法删除有序顺序表(n)中的所有元素值,其时间复杂度为()A. O(1)B. O(n)C.O(n2)D.O(logn)24.求删除循环双向链表(带头结点)中p节点的时间复杂度()A. O(1)B. O(n)C.O(n2)D.O(logn)5.一个栈S[0....n-1]的栈顶指针为top=n,则其进栈操作为()A.top++;S[top]=x;B.S[top]=x;top++;C.top--;S[top]=x;D.S[top]=x;top--;6.求"2*(3+4)-1"的后缀表达式()A.2#3#4#1*+-B.2#3#4#+*1#-C.2#3#4#*+1#-D.-+*2#3#4#1#7.循环队列中的元素个数为()A.rear-frontB.rear-front-1C.(rear-front)%n+1D.(rear-front+n)%n8.一个循环队列的尾指针rear=0,头指针front=3,则删除一个元素,增加两个元素后,其尾指针和头指针飞别为()A.1和5B.2和4C.4和2D.5和19.判断高度为h(h>=1)的完全二叉树至少有____个结点。
A.2h-1+1B.2hC.2h-1D.2h+110.哈夫曼树共有1999个结点,则其含有____个字符。
A.999B.998C.1000D.100111.判断含有n个结点的线索树,其含有____个线索。
A.2nB.n-1C.n+1D.n12.无向连通图的邻接矩阵为()A.稀疏矩阵B.稠密矩阵C.对称矩阵D.非对称矩阵13.设无向连通图有n个顶点,e条边,若满足____,则一定有回路。
A.e≥nB.e=n-1C.e<nD.2e>n14.AOE网的关键路径()A.任何一个关键活动提前完成,则整个工程一定会提前完成B.完成整个工程的最短时间是从源点到汇点的最短路径C.一个AOE网的关键路径一定是唯一的D.任何一个活动持续时间的改变可能会影响关键路径的改变15.具有100个元素的有序表,对其采用折半查找,则不成功的最大比较次数()A.25B.50C.10D.716.一个m阶的B-树,删除一个关键字引起合并,则其原本含有____个关键字。
A.1B.[m/2]C.[m/2]-1D.[m/2]+117.哈希查找一般适用于____情况下的查找。
A.查找表为链表B. 查找表为有序表C. 关键字集合比地址集合大得多D. 关键字集合与地址集合之间存在着某种...18.直接查找最好的时间复杂度是()) C.O(n2) D.O(√n)A.O(n)B.O(nlog2n19.对{24,88,21,48,15,27,69,35,20}进行递增排序,元素序列变化情况如下{24,88,21,48,15,27,69,35,20}{20,15,21,24,48,27,69,35,88}{15,20,21,24,35,27,48,69,88}{15,20,21,24,27,35,48,69,88}则其采用的排序方法为()A.快速排序B.简单选择排序C.直接插入排序D.归并排序20.下列不需要关键字比较的排序为()A.选择排序B.基数排序C.堆排序D.冒泡排序二.简答题(本大题共4小题,每小题5分,共20分)1.用简单的语言描述循环队列是如何提出的。
2.画出先序为ABC的所有不同的二叉树。
3.描述DFS和BFS的区别。
4.用简洁的语言描述堆和二叉树的区别。
三.计算题(本大题共3小题,每小题10分,共30分)1.带权连通无向图G,采用Prim算法构造出的最小生成树是否唯一。
2.现有一个哈希表{32,13,49,24,38,21,41,12},其哈希函数为H(key)=key%7,画出该哈希表,并计算出ASL(成功),ASL(不成功)3.元素{66,89,8,123,9,44,55,37,200,127,98}为大根堆,则删除其中的最大值,画出详细过程。
四.算法填空题(本大题共3小题,每小题10分,共30分)1.顺序表删除自第i个开始的k个元素。
#include <stdio.h>#define MAXSIZE 100typedef struct { int elem[MAXSIZE]; int last; } SeqList;void deletelist(SeqList *l,int i,int k);int main(){ int i,k,j=0; SeqList *l; SeqList a; l=&a; scanf("%d%d",&i,&k);//输入i和kwhile(scanf("%d",&l->elem[j])!=EOF) j++;//输入顺序表内容 l->last=j-1; deletelist(l,i,k); return 0; }void deletelist(SeqList *l,int i,int k){int j;if(i>l->last+1||i<1)printf("删除位置不合法");else{if(k>=l->last-i+2){for(j=i-1; j<=l->last; j++)l->elem[j]=0; l->last=i-2;}else{for(j=i-1; j<i-1+k; j++)l->elem[j]=0;for(j=i-1; j<=l->last-k; j++)l->elem[j]=l->elem[j+k];l->last=j-1;}for(j=0; j<=l->last; j++)printf("%d\n",l->elem[j]);}}判断两队列是否相等。
bool compare(List* a, List* b){int lengtha = length(a);int lengthb = length(b);if(lengtha != lengthb)return false;//排序,可以自行写冒泡或者其他sort(a);sort(b);for(int i=0;i<legnthal;i++){if(a[i] != b[i])return false;}return true;}3.二叉排序树的插入。
struct BinaryTreeNode {int val;BinaryTreeNode *left;BinaryTreeNode *right;BinaryTreeNode(int x) : val(x), left(NULL), right(NULL) {} // 构造函数,初始化节点};BinaryTreeNode* Insert(BinaryTreeNode* BST, int x){if(!BST){BST = new BinaryTreeNode(x);}else{if(x < BST->val)BST->left = Insert(BST->left, x);else if(x > BST->val)BST->right = Insert(BST->right, x);}return BST;}五.算法设计题(本大题共2小题,每小题15分,共30分)1.现有两个单链表A(m),B(n),其中的元素递增有序,在不破坏原链表的情况下,请设计一个算法,来求两单链表的交集放在单链表C中。
给出你所设计的算法时间复杂度和空间复杂度。
2.假设二叉树b采用二叉链存储结构,设计一个算法void findparent(BTNode*b,ElemType x, BTNode *&p)求指定值为x的结点的双亲结点p,提示:根据:根结点的双亲为NULL,若在b中未找到值为x的结点,p亦为NULL。