个人记录 错题
采用平方探测冲突解决策略(hi(k)=(H(k)+i2)%11, 注意:不是±i2),将一批散列值均等于2的对象连续插入一个大小为11的散列表中,那么第4个对象一定位于下标为0的位置。(2分) T
n!是O(nn)的。(2分) T
对一棵平衡二叉树,所有非叶结点的平衡因子都是0,当且仅当该树是完全二叉树。 (2分) F
对N个不同的数据采用冒泡排序进行从大到小的排序,当元素基本有序时交换元素次数肯定最多。 (2分) F
在一个有向图中,所有顶点的入度与出度之和等于所有边之和的2倍。(2分) T
单选题(22)
给定初始待排序列{ 15,9,7,8,20,-1,4 }。如果希尔排序第一趟结束后得到序列为{ 15,-1,4,8,20,9,7 },则该趟增量为: (4分) B.4
A.2 B.4 C.1 D.3
如果循环队列用大小为m
的数组表示,队头位置为front
、队列元素个数为size
,那么队尾元素位置rear
为:(2分) B. (front+size-1)%m
front+size-1
B.
(front+size-1)%m
C.
(front+size)%m D.front+size
设一个栈的输入序列是1、2、3、4、5,则下列序列中,是栈的合法输出序列的是? (4分) D.3 2 1 5 4
A. 4 3 1 2 5 B.4 5 1 3 2 C.5 1 2 3 4 D.3 2 1 5 4
数据结构中Dijkstra算法用来解决哪个问题?(2分) A.最短路径
设最小堆(小根堆)的层序遍历结果为{5, 18, 15, 28, 22, 42, 40}。用线性时间复杂度的算法将该堆调整为最大堆(大根堆),则该树的中序遍历结果为:(4分) A.18, 28, 22, 42, 15, 40, 5
A.18, 28, 22, 42, 15, 40, 5 B.5, 22, 18, 42, 15, 40, 28 C.18, 28, 22, 15, 40, 5, 42 D.22, 5, 18, 42, 40, 15, 28
在拓扑排序算法中用堆栈和用队列产生的结果会不同吗?(2分) C.有可能会不同
A.是的肯定不同 B.以上全不对 C.有可能会不同 D.肯定是相同的
要判断一个整数N(>10)是否素数,我们需要检查3到√N之间是否存在奇数可以整除N。则这个算法的时间复杂度是:(2分) A. O(√N)
给定输入序列 {4371, 1323, 6173, 4199, 4344, 9679, 1989} 以及散列函数 h(X)=X%10。如果用大小为10的散列表,并且用线性探测解决冲突,则输入各项经散列后在表中的下标为:(-1表示相应的插入无法成功)(4分) B. 1, 3, 4, 9, 5, 0, 2
设数字 {4371, 1323, 6173, 4199, 4344, 9679, 1989} 在大小为10的散列表中根据散列函数 h(X)=X%10得到的下标对应为 {1, 3, 4, 9, 5, 0, 2}。那么继续用散列函数 “h(X)=X%表长”实施再散列并用线性探测法解决冲突后,它们的下标变为:(4分) D.
下列叙述错误的是()。(2分) A.当一棵具有n 个叶子结点的二叉树的WPL 值为最小时,称其树为哈夫曼树,其二叉树的形状是唯一的
给定一有向图的邻接表如下。若从v1开始利用此邻接表做广度优先搜索得到的顶点序列为:{v1, v3, v2, v4, v5},则该邻接表中顺序填空的结果应为:(2分)
将 8, 9, 7, 2, 3, 5, 6, 4 顺序插入一棵初始为空的AVL树。下列句子中哪句是错的?(4分) D.5 是 8 的父结点
A.7 是根结点
试利用Floyed算法,求下图所示有向图的各对顶点之间的最短路径。下列选项哪个给出了正确的最短路径长度矩阵和最短路径矩阵?(4分) B

对给定序列{ 110,119,7,911,114,120,122 }采用次位优先(LSD)的基数排序,则两趟收集后的结果为:(2分) B.7, 110, 911, 114, 119, 120, 122
给定有权无向图的邻接矩阵如下,其最小生成树的总权重是:(4分) C.14
将1~6这6个键值插到一棵初始为空的二叉搜索树中。如果插入完成后,搜索树结构如图所示,问:可能的插入序列是什么?(2分)
给定二叉树如下图所示。设N代表二叉树的根,L代表根结点的左子树,R代表根结点的右子树。若遍历后的结点序列为3、1、7、5、6、2、4,则其遍历方式是:(2分) C.RNL
将 { 10, 12, 1, 14, 6, 5, 8, 15, 3, 9, 7 } 逐个按顺序插入到初始为空的最小堆中,然后连续执行两次删除最小元素操作(DeleteMin),再插入4,16,此后堆顶的元素是什么?(4分) A.4
在并查集问题中,已知集合元素0~8所以对应的父结点编号值分别是{ 1, -4, 1, 1, -3, 4, 4, 8, -2 }(注:−n表示树根且对应集合大小为n),那么将元素6和8所在的集合合并(要求必须将小集合并到大集合)后,该集合对应的树根和父结点编号值分别是多少?(4分) C. 4和-5
设栈S和队列Q的初始状态均为空,元素{1, 2, 3, 4, 5, 6, 7}依次进入栈S。若每个元素出栈后立即进入队列Q,且7个元素出队的顺序是{2, 5, 6, 4, 7, 3, 1},则栈S的容量至少是:(2分) B. 4
A.1
在图中自d点开始进行深度优先遍历算法可能得到的结果为:(2分) A.d,e,a,c,f,b
A.d,e,a,c,f,b
对一组数据{ 2,12,16,88,5,10 }进行排序,若前三趟排序结果如下: 第一趟排序结果:2,12,16,5,10,88 第二趟排序结果:2,12,5,10,16,88 第三趟排序结果:2,5,10,12,16,88 则采用的排序方法可能是:(2分) B.冒泡排序
A.希尔排序
下列代码的功能是对一个给定的图G
执行拓扑排序,其中TopNum[]
从1开始记录拓扑序。
void Topsort( Graph G ) { Queue Q; Vertex V, W; NodePtr ptr; int counter = 0; Q = CreateEmptyQueue(NumVertex); for ( V=0; V<G->NumV; V++ ) if ( Indegree[V] == 0 ) Enqueue(V, Q); while ( !IsEmpty(Q) ){ V = Dequeue( Q ); TopNum[V] = /*答题处1 (3分)*/; for ( ptr=G->List[V]; ptr; ptr=ptr->Next) { W = ptr->Vertex; if ( /*答题处2 (3分)*/== 0 ) Enqueue(W, Q); } } if ( counter != NumVertex ) printf("ERROR: Graph has a cycle.\n"); DisposeQueue(Q); }
答题处1. ++counter 2. --Indegree[W]
下列代码的功能是将一列元素{ r[1] … r[n]
}按其键值 key
的非递减顺序排序。普通选择排序是每次仅将一个待排序列的最小元放到正确的位置上,而这个另类的选择排序是每次从待排序列中同时找到最小元和最大元,把它们放到最终的正确位置上。
void sort( list r[], int n ) { int i, j, mini, maxi; for (i=1; i<n-i+1; i++) { mini = maxi = i; for( j=i+1; /*答题处1 (3分)*/; ++j ){ if( /*答题处2 3分*/ ) mini = j; else if(r[j]->key > r[maxi]->key) maxi = j; } if( /*答题处3 (3分)*/ ) swap(&r[mini], &r[i]); if( maxi != n-i+1 ){ if( /*答题处4 (3分)*/ ) swap(&r[mini], &r[n-i+1]); else swap(&r[maxi], &r[n-i+1]); } } }
答题处1. j<=n 2. r[j]->key < r[mini]->key 3. mini!=i 4. 不知道
编程题
R7-1 根据后序和中序遍历输出先序遍历
本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。
输入格式:
第一行给出正整数N(≤30),是树中结点的个数。随后两行,每行给出N个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。
输出格式:
在一行中输出Preorder:
以及该树的先序遍历结果。数字间有1个空格,行末不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
Preorder: 4 1 3 2 6 5 7
#include <iostream> #include <vector> using namespace std; void getPreOrder(int *postOrder,int *inOrder,int n){ if(n>0){ int root=postOrder[n-1]; int i=0; for(;i<n;i++){ if(inOrder[i]==root){ break; } } cout <<" "<< root; getPreOrder(postOrder,inOrder, i); getPreOrder(postOrder+i,inOrder+i+1, n-i-1); } } int main(){ int n,temp; cin >> n; int postOrder[30]; int inOrder[30]; for(int i=0;i<n;i++){ cin >> temp; postOrder[i]=temp; } for(int i=0;i<n;i++){ cin >> temp; inOrder[i]=temp; } cout <<"Preorder:"; getPreOrder(postOrder,inOrder,n); return 0; }
错题
判断题1-2 n! 是 O(n^n)的规模
选择题
2-9 再散列并用线性探测解决冲突; 其中 再散列的key%(new n): 新的散列表表长new n= 表长n*2之后的第一个素数 ; 本题n=10 故2n之后的第一个素数为23 ; (数据结构黑皮书-再散列)
2-13 Floyed 最短路径长度矩阵和最短路径矩阵 直接连通-1, 不连通 0, 多步连通(下一跳的序号)
2-18 看清题目 删除2个元素后还要再插入4 和16
5-2 第四空 脑子瓦特了