1、#*要求:所有的题目的解答均写在答题纸上,需写清楚题目的序号。每张答题纸都要写上姓名和学号。一、单项选择题(每小题 1.5 分,共计 30 分)1. 数据结构是指 。A. 一种数据类型B. 数据的存储结构C. 一组性质相同的数据元素的集合D. 相互之间存在一种或多种特定关系的数据元素的集合2. 以下算法的时间复杂度为 。void fun(int n) int i=1;while (i1)个元素的线性表的运算只有 4 种:删除第一个元素;删除最后一个元素;在第一个元素前面插入新元素;在最后一个元素的后面插入新元素,则最好使用以下哪种存储结构,并简要说明理由。(1)只有尾结点指针没有头结点指针的循
2、环单链表(2)只有尾结点指针没有头结点指针的非循环双链表(3)只有头结点指针没有尾结点指针的循环双链表(4)既有头结点指针也有尾结点指针的循环单链表2. 已知一棵度为 4 的树中,其度为 0、1、2、3 的结点数分别为 14、4、3、2,求该树的结点总数 n 和度为 4 的结点个数,并给出推导过程。3. 有人提出这样的一种从图 G 中顶点 u 开始构造最小生成树的方法:假设 G=(V,E)是一个具有 n 个顶点的带权连通无向图, T=(U,TE)是 G 的最小生成树,其中 U 是 T 的顶点集, TE 是 T 的边集,则由 G 构造从起始顶点 u 出发的最小生成树T 的步骤如下:(1)初始化
3、U=u。以 u 到其他顶点的所有边为候选边。(2)重复以下步骤 n-1 次,使得其他 n-1 个顶点被加入到 U 中。从 候 选 边 中 挑 选 权 值 最 小 的 边 加 入 到 TE, 设 该 边 在 V-U 中 的 顶 点 是 v, 将 v 加 入 U 中 。考查顶点 v,将 v 与 V-U 顶点集中的所有边作为新的候选边。若此方法求得的 T 是最小生成树,请予以证明。若不能求得最小边,请举出反例。4. 有一棵二叉排序树按先序遍历得到的序列为:(12,5,2,8,6,10,16,15,18,20)。回答以下问题:(1)画出该二叉排序树。(2)给出该二叉排序树的中序遍历序列。(3)求在等概
4、率下的查找成功和不成功情况下的平均查找长度。#*三、算法设计题(每小题 10 分,共计 30 分)1. 设 A 和 B 是两个结点个数分别为 m 和 n 的单链表(带头结点) ,其中元素递增有序。设计一个尽可能高效的算法求 A 和 B 的交集,要求不破坏 A、B 的结点,将交集存放在单链表 C 中。给出你所设计的算法的时间复杂度和空间复杂度。2. 假设二叉树 b 采用二叉链存储结构,设计一个算法 void findparent(BTNode *b,ElemType x,BTNode * /专业、班号或姓名float score; /分数struct node *child; /指向最左边的孩子
5、结点struct node *brother; /指向下一个兄弟结点 TNode;完成以下算法:(1)设计一个算法求所有的学生人数。(2)求指定某班的平均分。 name:计 算 机 专 业 score:0 name:计 科 1 score:0 name:王 华 score:86 name:李 明score:79 name:张 兵score:79 name:计 科 n score:0 name:陈 强 score:85 name:许 源score:92 name:张 山score:69 图 1 一棵学生成绩树#*“数据结构”考试试题(A)参考答案要求:所有的题目的解答均写在答题纸上,需写清楚题目
6、的序号。每张答题纸都要写上姓名和学号。一、单项选择题(每小题 1.5 分,共计 30 分)1. D 2. A 3. A 4. A 5. C6. B 7. D 8. B 9. A 10. C11. C 12. A 13. A 14. D 15. D16. C 17. D 18. A 19. A 20. C二、问答题(共 4 小题,每小题 10 分,共计 40 分)1. 答:本题答案为(3) ,因为实现上述 4 种运算的时间复杂度均为 O(1)。【评分说明】选择结果占 4 分,理由占 6 分。若结果错误,但对各操作时间复杂度作了分析,可给 25 分。2. 答:结点总数 n=n0+n1+n2+n3+
7、n4,即 n=23+n4,又有:度之和=n-1=0n0+1n1+2n2+3n3+4n4,即 n=17+4n4,综合两式得:n 4=2,n=25。所以,该树的结点总数为 25,度为4 的结点个数为 2。【评分说明】结果为 4 分,过程占 6 分。3. 答:此方法不能求得最小生成树。例如,对于如图 5.1(a )所示的带权连通无向图,按照上述方法从顶点 0 开始求得的结果为 5.1(b)所示的树,显然它不是最小生成树,正确的最小生成树如图 5.1(c)所示。在有些情况下,上述方法无法求得结果,例如对于如图 5.1(d)所示的带权连通无向图,从顶点 0 出发,找到顶点 1(边(0,1) ) ,从顶点
8、 1 出发,找到顶点 3(边(1,3) ) ,再从顶点 3 出发,找到顶点 0(边(3,0) ) ,这样构成回路,就不能求得最小生成树了。 0 1 1 3 2 2 3 4 5 0 1 1 3 2 2 4 3 5 ( a) ( d) 0 1 1 3 2 3 5 ( b) 0 1 1 3 2 3 ( c) 4 图 1 求最小生成树的反例#*说明:只需给出一种情况即可。【评分说明】回答不能求得最小生成树得 5 分,反例为 5 分。若指出可求得最小生成树,根据证明过程给 12 分。4. 答:(1)先序遍历得到的序列为:(12,5,2,8,6,10,16,15,18,20),中序序列是一个有序序列,所以
9、为:(2,5,6,8,10,12,15,16,18,20),由先序序列和中序序列可以构造出对应的二叉树,如图 2 所示。(2)中序遍历序列为:2,5,6,8,10,12,15,16,18,20。(3)ASL 成功 =(11+22+43+34)/10=29/10。ASL 不成功 =(53+64/11=39/11。12 5 2 8 6 10 16 15 18 20 图 2【评分说明】 (1)小题占 6 分, (2) (3)小题各占 2 分。三、算法设计题(每小题 10 分,共计 30 分)1. 设 A 和 B 是两个结点个数分别为 m 和 n 的单链表(带头结点) ,其中元素递增有序。设计一个尽可
10、能高效的算法求 A 和 B 的交集,要求不破坏 A、B 的结点,将交集存放在单链表 C 中。给出你所设计的算法的时间复杂度和空间复杂度。解:算法如下:void insertion(LinkList *A,LinkList *B,LinkList *C=(LinkList *)malloc(sizeof(LinkList);t=C;while (p!=NULL s-data=p-data;t-next=s;t=s;p=p-next;q=q-next;else if (p-datadata)p=p-next;#*elseq=q-next;t-next=NULL;算法的时间复杂度为 O(m+n),空
11、间复杂度为 O(MIN(m,n)。【评分说明】算法为 8 分,算法的时间复杂度和空间复杂度各占 1 分。2. 假设二叉树 b 采用二叉链存储结构,设计一个算法 void findparent(BTNode *b,ElemType x,BTNode *else if (b-lchild!=NULL else if (b-rchild!=NULL else findparent(b-lchild,x,p);if (p=NULL)findparent(b-rchild,x,p);else p=NULL;【评分说明】本题有多种解法,相应给分。3. 假设一个连通图采用邻接表 G 存储结构表示。设计一个算
12、法,求起点 u 到终点 v的经过顶点 k 的所有路径。解:算法如下:int visitedMAXV=0; /全局变量void PathAll(ALGraph *G,int u,int v,int k,int path,int d)/d 是到当前为止已走过的路径长度,调用时初值为-1 int m,i;ArcNode *p;visitedu=1;d+; /路径长度增 1pathd=u; /将当前顶点添加到路径中if (u=v for (i=0;iadjlistu.firstarc; /p 指向顶点 u 的第一条弧的弧头节点while (p!=NULL) m=p-adjvex; /m 为 u 的邻接
13、点if (visitedm=0) /若该顶点未标记访问,则递归访问之PathAll(G,m,v,l,path,d);p=p-nextarc; /找 u 的下一个邻接点visitedu=0; /恢复环境:使该顶点可重新使用int In(int path,int d,int k) /判断顶点 k 是否包含在路径中 int i;for (i=0;ichild=NULL) return 1;return count(b-child)+count(b-brother);说明:本题可以从链表的角度求解。(2)算法如下:int Average(TNode *b,char class,float float sum=0;TNode *p=b-child; /p 指向班号结点while (p!=NULL if (p=NULL) return 0; /没找到该班号,返回 0p=p-child; /p 指向该班的第一个学生while (p!=NULL)n+; /累计人数sum+=p-score; /累计分数p=p-brother;avg=sum/n; /求平均分return 1;【评分说明】两小题各占 5 分。