一、判断题
- 1
若一棵平衡二叉树的所有非叶结点的平衡因子都是0,则其必为完美二叉树。(2分)
T F
- 2
2N2^N和NNN^N具有相同的增长速度。 (2分)
T F
- 3
若用平方探测法解决冲突,则插入新元素时,若散列表容量为质数,插入就一定可以成功。 (2分)
T F
- 4
对N个不同的数据采用冒泡排序进行从大到小的排序,当元素基本有序时交换元素次数肯定最多。 (2分)
T F
- 5
无向连通图至少有一个顶点的度为1。 (2分)
T F
- 1
在拓扑排序算法中用堆栈和用队列产生的结果会不同吗?(2分)
- 肯定是相同的
- 以上全不对
- 有可能会不同
- 是的肯定不同
- 2
将10, 12, 1, 14, 6, 5, 8, 15, 3, 9, 7逐个按顺序插入到初始为空的最小堆中,然后连续执行两次删除最小元素操作(DeleteMin),再插入4,16,此后堆顶的元素是什么? (2分)
- 5
- 9
- 7
- 4
- 3
要判断一个整数NN(>10)是否素数,我们需要检查3到√N之间是否存在奇数可以整除N。则这个算法的时间复杂度是:(2分)
- O(N/2)
- O(√NlogN)
- O(√N)
- O(0.5logN)
- 4
线性表、堆栈、队列的主要区别是什么?(2分)
- 堆栈和队列都不是线性结构,而线性表是
- 线性表用指针,堆栈和队列用数组
- 堆栈和队列都是插入、删除受到约束的线性表
- 线性表和队列都可以用循环链表实现,但堆栈不能
- 5
已知一个图的邻接矩阵如下,则从顶点V1出发按深度优先搜索法进行遍历,可能得到的一种顶点序列为: (2分)
- V1,V3,V5,V2,V4,V6
- V1,V2,V4,V5,V6,V3
- V1,V2,V3,V4,V5,V6
- V1,V3,V5,V6,V4,V2
- 6
将 9, 8, 7, 2, 3, 5, 6, 4 顺序插入一棵初始为空的AVL树。下列句子中哪句是错的? (4分)
- 有2个结点的平衡因子为-1
- 最后得到的AVL树的高度是3
- 2 和 5 是兄弟
- 5 是根结点
- 7
将序列{ 2, 12, 16, 88, 5, 10, 34 }排序。若前2趟排序的结果如下:
- 第1趟排序后:2, 12, 16, 10, 5, 34, 88
- 第2趟排序后:2, 5, 10, 12, 16, 34, 88
则可能的排序算法是:(2分)
- 冒泡排序
- 归并排序
- 插入排序
- 快速排序
- 8
设栈S和队列Q的初始状态均为空,元素a、b、c、d、e、f、g依次进入栈S。若每个元素出栈后立即进入队列Q,且7个元素出队的顺序是b、d、c、f、e、a、g,则栈S的容量至少是: (2分)
- 2
- 1
- 4
- 3
- 9
在利用堆栈将下列哪个中缀表达式转换为后缀表达式过程中,堆栈的操作系列为: push('*') 、push('(')、 push('+')、pop()、pop()、pop()、push('*')、pop()、push('+')、pop() (2分)
- 2*(3+4*5+6)
- 2*(3+4*5)+6
- 2*(3+4)*5+6
- 以上都是
- 10
采用线性探测冲突解决策略,hi(k)=(H(k)+i)mod 11,将散列函数值分别等于2、2、3、3的四个对象a1、a2、a3、a4都插入一个大小为11的空散列表(哈希表)中。在不同的插入顺序中,哪句有关插入后散列表平均成功查找长度的判断是错的? (4分)
- 按a1、a3、a2、a4顺序和按a4、a1、a2、a3顺序,平均成功查找长度一样;
- 按任何插入顺序,其平均成功查找长度都一样.
- 按a1、a3、a2、a4顺序和按a3、a1、a2、a4顺序,平均成功查找长度一样;
- 按a1、a2、a3、a4顺序和按a1、a3、a4、a2顺序,平均成功查找长度一样;
- 11
给出关键字序列{ 4321, 56, 57, 46, 28, 7, 331, 33, 234, 63 },下面哪个选择是按次位优先(LSD)链式基数排序进行了一趟分配和收集的结果? (2分)
- →4321→331→33→63→234→56→46→57→7→28
- →56→28→4321→331→33→234→46→57→63→7
- →57→46→28→7→33→234→63→56→4321→331
- →331→4321→33→63→234→56→46→57→7→28
- 12
给定一有向图的邻接表如下。从顶点V1出发按广度优先搜索法进行遍历,则得到的一种顶点序列为: (2分)
- V1,V3,V2,V4,V5
- V1,V4,V3,V5,V2
- V1,V2,V3,V5,V4
- V1,V2,V3,V4,V5
- 13
将1~6这6个键值插到一棵初始为空的二叉搜索树中。如果插入完成后,搜索树结构如图所示,问:可能的插入序列是什么? (2分)
- 4 1 2 3 5 6
- 4 1 3 2 5 6
- 1 2 3 4 5 6
- 4 1 3 2 6 5
- 14
对NN(N≥2)个权值均不相同的字符构造哈夫曼树。下列关于该哈夫曼树的叙述中,错误的是: (2分)
- 树中一定没有度为1的结点
- 树中任一非叶结点的权值一定不小于下一层任一结点的权值
- 该树一定是一棵完全二叉树
- 树中两个权值最小的结点一定是兄弟结点
- 15
在一个有权无向图中,如果顶点b到顶点a的最短路径长度是10,顶点c与顶点b之间存在一条长度为3的边。那么下列说法中有几句是正确的? (2分)
- c与a的最短路径长度就是13
- c与a的最短路径长度就是7
- c与a的最短路径长度不超过13
- c与a的最短路径不小于7
- 1句
- 4句
- 3句
- 2句
- 16
将 {28, 15, 42, 18, 22, 5, 40} 逐个按顺序插入到初始为空的最小堆(小根堆)中。则该树的前序遍历结果为:(4分)
- 5, 18, 15, 28, 22, 42, 40
- 5, 18, 28, 22, 15, 42, 40
- 5, 15, 18, 22, 28, 42, 40
- 5, 15, 28, 18, 22, 42, 40
- 17
在并查集问题中,已知集合元素0~8所以对应的父结点编号值分别是{ 1, -4, 1, 1, -3, 4, 4, 8, -2 }(注:−n-n−n表示树根且对应集合大小为nnn),那么将元素6和8所在的集合合并(要求必须将小集合并到大集合)后,该集合对应的树根和父结点编号值分别是多少? (4分)
- 4和-5
- 1和-6
- 8和-6
- 8和-5
- 18
给定有权无向图的邻接矩阵如下,其最小生成树的总权重是:(2分)
- 23
- 24
- 17
- 18
- 19
给定输入序列 {4371, 1323, 6173, 4199, 4344, 9679, 1989} 以及散列函数 h(X)=X%10h(X) = X \%10h(X)=X%10。如果用大小为10的散列表,并且用分离链接法解决冲突,则输入各项经散列后在表中的下标为:(-1表示相应的插入无法成功)(2分)
- 1, 3, 3, 9, 4, 9, 9
- 1, 3, 4, 9, 5, 0, 8
- 1, 3, 4, 9, 5, 0, 2
- 1, 3, 4, 9, 7, 5, -1
- 20
将MMM个元素存入用长度为SSS的数组表示的散列表,则该表的装填因子为: (2分)
- M−S
- M/S
- S+M
- M×S
三、程序填空题
- 1
本题要求给出希尔排序对给定初始序列{9, 8, 7, 6, 5, 4, 3, 2, 1}利用增量序列{1, 3, 7}进行排序的分步结果。将每步结果填在下列空中。注意:相邻数字间必须有一个空格,开头结尾不得有多余空格。
原始序列 9 8 7 6 5 4 3 2 1 增量7排序后 (2分) 增量3排序后 (2分) 增量1排序后 1 2 3 4 5 6 7 8 9
- 2
下列代码的功能是将一列元素{
r[1] … r[n]
}按非递减顺序排序。普通选择排序是每次仅将一个待排序列的最小元放到正确的位置上,而这个另类的选择排序是每次从待排序列中同时找到最小元和最大元,把它们放到最终的正确位置上。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; (4分); ++j ){ if( (4分) ) mini = j; else if(r[j]->key > r[maxi]->key) maxi = j; } if( (4分) ) swap(&r[mini], &r[i]); if( maxi != n-i+1 ){ if( (4分) ) swap(&r[mini], &r[n-i+1]); else swap(&r[maxi], &r[n-i+1]); } } }
- 3
下列代码的功能是将小顶堆
H
中指定位置P
上的元素的整数键值下调D
个单位,然后继续将H
调整为小顶堆。void DecreaseKey( int P, int D, PriorityQueue H ) { int i, key; key = H->Elements[P] - D; for ( i = (4分); H->Elements[i/2] > key; i/=2 ) (4分); H->Elements[i] = key; }
- 4
本题要求给出下图中从A到其他顶点的最短路径。注意:填空时不能有任何空格。
终点 路径 A->B AB A->C AC A->D (2分) A->E (2分) A->F (2分) A->G ABG
四、编程题
1 根据后序和中序遍历输出先序遍历 (8分)
本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。
输入格式:
第一行给出正整数NNN(≤30\le 30≤30),是树中结点的个数。随后两行,每行给出NNN个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。
输出格式:
在一行中输出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;
vector<int> post, in, pre;
int k = 0;
void GetPre(int root, int start, int end) {
if(start > end) return ;
int i = start;
while(i < end && in[i] != post[root]) i++;
//pre[k++] = post[root] ;
pre.push_back( post[root] );
GetPre(root - 1 - end + i, start, i - 1);
GetPre(root - 1, i + 1, end);
}
int main() {
int N;
cin >> N;
post.resize(N);
in.resize(N);
//pre.resize(N); //指定大小的vector不能使用push_back
for ( int i = 0; i < N; i++ )
cin >> post[i];
for ( int i = 0; i < N; i++ )
cin >> in[i];
GetPre( N - 1, 0, N - 1);
cout << "Preorder: " << pre[0];
for ( int i = 1; i < N; i++ )
cout << " " << pre[i];
return 0;
}