
1. 算法必须具备输入、输出和 [ C ]
A. 计算方法 B. 排序方法
C.解决问题的有限运算步骤 D. 程序设计方法
2. 有n个节点的顺序表中,算法的时间复杂度是O(1)的操作是 [ A ]
A.访问第i个节点(1≤i≤n)
B.在第i个节点后插入一个新节点(1≤i≤n)
C.删除第i个节点(1≤i≤n)
D.将n个节点从小到大排序
3.单链表的存储密度 [ C ]
A.大于1 B. 等于1
C.小于1 D. 不能确定
4.设将整数1,2,3,4,5依次进栈,最后都出栈,出栈可以在任何时刻(只要栈不空)进行,则出栈序列不可能是 [ B ]
A.23415 B. 54132
C.23145 D. 15432
5. 循环队列SQ的存储空间是数组d[m],队头、队尾指针分别是front和rear,则执行出队后其头指针front值是 [ D ]
A.front=front+1 B. front=(front+1)%(m-1)
C. front=(front-1)%m D. front=(front+1)%m
6. 在一个具有n个结点的有序单链表中插入一个新结点并仍然保持有序的时间复杂度是 [ B ]
A. O(1) B. O(n) C. O(n2) D. O(nlogn)
7. 设二维数组A[0..m-1][0..n-1]按行优先顺序存储,则元素A[i][j]的地址为 [ B ]
A. LOC(A[0][0])+(i*m+j) B.LOC(A[0][0])+(i*n+j)
C.LOC(A[0][0])+[(i-1)*n+j-1] D. LOC(A[0][0])+[(i-1)*m+j-1]
8. 一个非空广义表的表头 [ D ]
A.一定是子表 B. 一定是原子
C.不能是子表 D. 可以是原子,也可以是子表
9.具有n个节点的完全二叉树的深度为 [ A ]
A.log2(n+1) -1 B. log2n+1
C. log2n D. log2n
10. 若要惟一地确定一棵二叉树,只需知道该二叉树的 [ D ]
A.前序序列 B. 中序序列
C.前序和后序序列 D. 中序和后序序列
11.在一个无向图中,所有顶点的度数之和等于图的边数的 倍 [ C ]
A.1/2 B. 1
C. 2 D. 4
12. 拓扑排序运算只能用于 [ C ]
A.带权有向图 B. 连通无向图
C.有向无环图 D. 无向图
13.在所有排序方法中,关键字比较的次数与记录的初始排列次序无关的是 [ D ]
A.希尔排序 B. 冒泡排序
C.插入排序 D. 选择排序
14.下列排序算法中时间复杂度不受数据初始状态影响,恒为O(n2)的是 [ C ]
A.堆排序 B. 冒泡排序
C.直接选择排序 D. 快速排序
15.二分查找要求节点 [ A ]
A.有序、顺序存储 B. 有序、链接存储
C.无序、顺序存储 D. 无序、链接存储
二、填空题(本大题共10小题,每小题2分,共20分)不写解答过程,将正确的答案写在每小题的空格内。错填或不填均无分。
16.数据的逻辑结构分为两大类,它们是线性结构和 非线性结构 。
17.在单链表中(假设结点指针域名称为next),删除指针P所指结点的后继结点的语句是 p->next=p->next->next 。
18.已知循环队列用数组data[n]存储元素值,用front,rear分别作为头尾指针,则当前元素个数为 (rear-front+n)%n 。
19. 若n为主串长,m 为子串长,则串的朴素匹配算法最坏的情况下需要比较字符的总次数为_______(n-m+1)×m_ _。
20. 广义表((a),((b),j,(((d)))))的表尾是____(((b),j,(((d)))))___ _____。
21. 已知二叉树有61个叶子节点,且仅有一个孩子的节点数为45,则总节点数为____166 __。
22. 解决计算机与打印机之间速度不匹配问题,须要设置一个数据缓冲区,应是一个 队列 结构。
23. n 个顶点e条边的图采用邻接表存储,深度优先遍历算法的时间复杂度为_________O(n+e)___________。
24. 对于n个关键字的集合进行冒泡排序,在最坏情况下所需要的时间为_____O(n2)________。
25.在一个长度为n的顺序表中的第i个元素(1≤i≤n)之前插入一个元素时,需向后
移 n-i+1 个元素。(第i个元素一直到第n个元素都要逐一向后移动,故为n-i+1)
三、解答题(本大题共4小题,共25分)
26. 对于下面的稀疏矩阵,画出其三元组法存储表示(假设下标从0开始)。(5分)
0 0 14 0 0 0
0 0 0 0 -6 0
7 0 0 0 0 24
0 0 0 18 0 0
0 15 0 0 0 0
答案:
| 0 | 2 | 14 |
| 1 | 4 | -6 |
| 2 | 0 | 7 |
| 2 | 5 | 24 |
| 3 | 3 | 18 |
| 4 | 1 | 15 |
27. 已知一棵二叉树的中序序列和后序序列分别如下,请画出该二叉树。(5分)
中序序列:D I G J L K B A E C H F
后序序列:I L K J G D B E H F C A
答案:
28. 设有一个关键码的输入序列{55,31,11,37,46,73,63,02,07},(7分)
(1)从空树开始构造平衡二叉搜索树,画出每加入一个新结点时二叉树的形态。若发生不平衡,指明需做的平衡旋转的类型及平衡旋转的结果。(3分)
(2)计算该平衡二叉搜索树在等概率下的搜索成功的平均搜索长度和搜索不成功的平均搜索长度。(4分)
29. 已知一个图的邻接表如下所示。(8分)
(1)画出该图的图形;(4分)
(2)根据邻接表分别画出从顶点a出发进行深度优先和广度优先遍历所生成的生成树。(4分)
0
1
2
3
4
5
答案:
四、算法阅读题(本大题共3小题,每小题5分,共15分)
30.设线性表的n个结点定义为(a0,a1,…,an-1),在顺序表上实现的插入和删除算法如下,请在空白处填入适当内容。(顺序表的最大可容纳项数为MaxSize)
Template If (i<0 || i>last+1 || last== (1) ) return 0; Else { Last++; For(int j=last;j>i;j--) data[j]= (2) ; (3) ; Return 1; } } Template int i=Find(x); if(i>=0) { last--; for (int j= (4) ;j<=last;j++) data[j]= (5) ; return 1; } return 0; } 答案: (1) MaxSize-1 (2) data[j-1] (3) Data[i]=x (4) i (5) data[j+1] 31.阅读下面的算法,请回答下列问题: (1)试说明算法的功能。 (2)当执行该程序时,输入12345678-1,输出什么结果? #define StackSize 200 typedef int DataType; typedef struct{ DataType data[StackSize]; int top; }SeqStack; void Push(SeqStack *s,DataType x) { if(s->top!=StackSize-1) s->data[++s->top]=x; } DataType Pop(SeqStack *s) { if(s->top!=-1) return s->data[s->top--]; } void main( ) { DataType i; SeqStack s; s.top=-1; scanf(“%d”,&i); while(i!=-1) { push(&s,i); scanf(“%d”,&i); } while(s->top!=-1) { i=Pop(&s); printf(“%6d”,i); } } 答案: (1)程序的功能是把输入的一串整数(用-1做结束标记) ,按照与输入相反的次序输出。用栈实现这一功能。 (2)输出结果 8 7 6 5 4 3 2 1。 32. 已知二叉树的存储结构为二叉链表,阅读下面算法。说明该算法的功能。 Template int BinaryTree if(t==NULL) return –1; int h1=height(t->leftChild); int hr=height(t->rightChild); return 1+(h1>hr?h1:hr); } 答案:该算法的功能是统计二叉树的高度。 五、算法设计题(本题共10分) 33.设一棵二叉树以二叉链表表示,试以成员函数形式编写有关二叉树的递归算法。 (1)统计二叉树中度为1的结点个数;(5分) (2)统计二叉树中度为2的结点个数。(5分) (提示:递归算法如32题所示) 解答:(1)统计二叉树中度为1的结点个数。 Template Int BinaryTree If(t==NULL) return 0; If(t->leftchild!=NULL &&t->rightchild==NULL || t->leftchild==NULL &&t->rightchild!=NULL) Return 1+Degree1(t->leftchild)+Degree1(t->rightchild); Return Degree1(t->leftchild)+Degree1(t->rightchild); } (2) 统计二叉树中度为2的结点个数。 Template Int BinaryTree If(t==NULL) return 0; If(t->leftchild!=NULL &&t->rightchild!=NULL ) Return 1+Degree2(t->leftchild)+Degree2(t->rightchild); Return Degree2(t->leftchild)+Degree2(t->rightchild); }
