要求:所有的题目的解答均写在答题纸上,需写清楚题目的序号。每张答题纸都要写上姓名和学号。一、单项选择题(每小题2分,共20小题,共计40分)1.某算法的空间复杂度为O(1),则。A.该算法执行不需要任何辅助空间B.该算法执行所需辅助空间大小与问题规模n无关C.该算法执行不需要任何空间D.该算法执行所需全部空间大小与问题规模n无关2.在长度为n的顺序表中插入一个元素,对应算法的时间复杂度为。A.O(1)B.O(log2n)C.O(n)D.O(n2)3.设线性表中有n个元素,以下运算中,在单链表上实现要比在顺序表上实现效率更高。A.删除指定位置元素的后一个元素B.在最后一个元素的后面插入一个新元素C.顺序输出前k个元素D.交换第i个元素和第n-i+1个元素的值(i=1,2,…,n)4.以下数据结构中元素之间为非线性关系的是。A.栈B.队列C.线性表D.以上都不是5.若一个栈用数组data[1..n]存储,初始栈顶指针top为n+1,则以下元素x进栈的正确操作是。A.top++;data[top]=x;B.data[top]=x;top++;C.top--;data[top]=x;D.data[top]=x;top--;6.若某循环队列有队首指针front和队尾指针rear,在队不满时进队操作仅会改变。A.frontB.rearC.front和rearD.以上都不队7.设循环队列中数组的下标是0~N-1,其队头、队尾指针分别为f和r(f指向队首元素的前一位置,r指向队尾元素),则其元素个数为。A.r-fB.r-f-1C.(r-f)%N+1D.(r-f+N)%N8.设树T的度为4,其中度为1、2、3、4的结点个数分别为4、2、1、1,则T中的叶子结点个数是。A.5B.6C.7D.89.一棵哈夫曼树中共有199个结点,它用于多少个字符的编码。A.99B.100C.101D.19910.设森林F中有4棵树,第1、2、3、4棵树的结点个数分别为a、b、c、d,将森林F转换为一颗二叉树B,则二叉树B根结点的左子树上的结点个数是。A.a-1B.aC.a+b+cD.b+c+d11.下列关于图的叙述中,正确的是。Ⅰ.回路是简单路径Ⅱ.存储稀疏图,用邻接矩阵比邻接表更省空间Ⅲ.若有向图中存在拓扑序列,则该图不存在回路A.仅ⅡB.仅Ⅰ、ⅡC.仅ⅢD.仅Ⅰ、Ⅲ12.以下关于有向图的说法中,正确的是。A.强连通图是任何顶点到其他所有顶点都有边B.完全有向图一定是强连通图C.有向图中任一顶点的入度等于出度D.有向图边集的子集和顶点集的子集可构成原有向图的子图13.无向图的邻接矩阵是一个。A.对称矩阵B.零矩阵C.上三角矩阵D.对角矩阵14.如果从无向图的任一顶点出发进行一次广度优先遍历即可访问所有顶点,则该图一定是。A.完全图B.连通图C.有回路D.一棵树15.用Dijkstra算法求一个带权有向图G中从顶点0出发的最短路径,在算法执行的某时刻,S={0,2,3,4},下一步选取的目标顶点可能是。A.顶点2B.顶点3C.顶点4D.顶点716.哈希表中出现冲突是指。A.两个元素具有相同的序号B.两个元素的关键字不同,而其他属性相同C.数据元素过多D.两个元素的关键字不同,而对应的哈希函数值(存储地址)相同17.适合于折半查找的数据组织方式是。A.以链表存储的线性表B.以顺序表存储的任意线性表C.以链表存储的有序线性表D.以顺序表存储的有序线性表18.对有n个记录的表进行直接插入排序,在最好情况下需比较次关键字。A.n-1B.n+1C.n/2D.n(n-1)/219.若数据元素序列{11,12,15,7,8,9,23,1,5}是采用下列排序方法之一得到的第二趟排序后的结果,则该排序算法只能是。A.冒泡排序B.直接插入排序C.选择排序D.二路归并排序20.对一组数据(25,84,21,47,15,27,68,35,20)进行排序,前3趟的排序结果如下:第1趟:20,15,21,25,47,27,68,35,84第2趟:15,20,21,25,35,27,47,68,84第3趟:15,20,21,25,27,35,47,68,84则所采用的排序方法是。A.简单选择排序B.希尔排序C.二路归并排序D.快速排序二、问答题(共4小题,共计35分)1.(10分)对于如图1所示的带权无向图,直接给出利用普里姆算法(从顶点0开始构造)和克鲁斯卡尔算法构造出的最小生成树的结果(注意:按求解的顺序给出最小生成树的所有边,每条边用(i,j)表示)。01234515237684图1一个带权无向图G2.(10分)假设一棵二叉排序树的关键字为单个字母,其后序遍历序列为ACDBFIJHGE,回答以下问题:(1)画出该二叉排序树。(6分)(2)求在等概率下的查找成功的平均查找长度。(2分)(3)求在等概率下的查找不成功的平均查找长度。(2分)3.(8分)已知序列{15,5,16,2,25,8,20,9,18,12},给出采用二路归并排序法对该序列作升序排序时的每一趟的结果。4.(7分)简要回答下列关于堆排序中堆的一些问题:(1)通常堆采用顺序还是链式存储结构?(3分)(2)设有一个小根堆,即堆中任意结点的关键字均小于它的左孩子和右孩子的关键字。其中具有最大关键字的结点可能在什么地方?(4分)三、算法设计题(共2小题,共计25分)1.(10分)某带头结点的非空单链表L中所有元素为整数,结点类型定义如下:typedefstructnode{intdata;structnode*next;}LinkNode;设计一个尽可能高效的算法,将所有小于零的结点移到所有大于等于零的结点的前面。2.(15分)假设二叉树中有n个结点,每个结点值为单个字符,而且所有结点值均不相同,采用二叉链存储结构存储,其结点类型定义如下:typedefstructnode{chardata;structnode*lchild,*rchild;}BTNode;请完成以下任务:(1)设计一个算法,在二叉树b中查找x结点(指结点值为x的结点),若找到该结点,返回其地址,否则返回NULL。给出你设计的算法的时间复杂度。(8分)(2)设计一个算法,利用(1)小题设计的算法输出二叉树b中x结点的所有子孙结点值。(7分)“数据结构”考试试题(A)参考答案一、单项选择题(每小题2分,共20小题,共计40分)1.B2.C3.A4.D5.C6.B7.D8.D9.B10.A11.C12.B13.A14.B15.D16.D17.D18.A19.B20.D二、问答题(共4小题,共计35分)1.(10分)答案:利用普里姆算法从顶点0出发构造的最小生成树为:{(0,1),(0,3),(1,2),(2,5),(5,4)},(5分)。利用克鲁斯卡尔算法构造出的最小生成树为:{(0,1),(0,3),(1,2),(5,4),(2,5)},(5分)。说明:顺序错误不给分。2.(10分)答案:(1)该二叉排序树的后序遍历序列为ACDBFIJHGE,则中序遍历序列为ABCDEFGHIJ,由后序序列和中序序列构造的二叉排序树如图2所示。(6分)ABDICEGHJF图2一棵二叉排序树(2)ASL成功=(1×1+2×2+4×3+2×4+1×5)/10=3。(2分)(3)ASL不成功=(6×3+3×4+2×5)/11=40/11=3.64。(2分)3.(8分)答案:采用二路归并排序法排序的各趟结果如图3所示。(每趟2分)排序前:15,5,16,2,25,8,20,9,18,12length=1:5,15,2,16,8,25,9,20,12,18length=2:2,5,15,16,8,9,20,25,12,18length=4:2,5,8,9,15,16,20,25,12,18length=8:2,5,8,9,12,15,16,18,20,25排序后:2,5,8,9,12,15,16,18,20,25图3各趟排序结果4.(7分)答案:(1)通常堆采用顺序存储结构。(3分)(2)小根堆中具有最大关键字的结点只可能出现在叶子结点中。因为最小堆的最小关键字的结点必是根结点,而最大关键字的结点由偏序关系可知,只有叶子结点可能是最大关键字的结点。(4分)三、算法设计题(共2小题,共计25分)1.(10分)答案:voidMove(LinkNode*&L){LinkNode*p=L-next,*pre=L;while(p!=NULL&&p-data0)//跳过小于0的结点{pre=p;p=pre-next;}while(p!=NULL){if(p-data0)//若*p结点值小于0{pre-next=p-next;//从链表中删除*p结点p-next=L-next;//将*p结点插入到头结点之后L-next=p;p=pre-next;//p指向*pre之后结点,pre不变}else//若*p结点值不小于0{pre=p;//pre、p同步后移一个结点p=p-next;}}}2.(15分)答案:(1)(7分)BTNode*Findx(BTNode*b,charx)//在二叉树b中查找x结点{BTNode*p;if(b==NULL)returnNULL;else{if(b-data==x)returnb;p=Findx(b-lchild,x);if(p!=NULL)returnp;returnFindx(b-rchild,x);}}算法的时间复杂度为O(n)(1分)。(2)(7分)voidSons(BTNode*b,charx)//输出x结点的子孙,初始时b指向x结点{if(b!=NULL){if(b-data!=x)printf(%c,b-data);Sons(b-lchild,x);Sons(b-rchild,x);}}voidOutSons(BTNode*b,charx)//输出二叉树b中x结点的所有子孙结点值{BNode*p=Findx(b,x);if(p!=NULL)Sons(p,x);}