按Ctrl+F 查询题目答案😄
没查到想要的题目?
这里还有👉中国大学MOOC-陈越、何钦铭-数据结构-2020春期末考试(2)
判断题
1-1 无向连通图边数一定大于顶点个数减1。
1-2 若用平方探测法解决冲突,则插入新元素时,若散列表容量为质数,插入就一定可以成功。
1-3 对N个不同的数据采用冒泡排序进行从大到小的排序,当元素基本有序时交换元素次数肯定最多。
1-4 N2logN和NlogN2具有相同的增长速度。
1-5 对一棵平衡二叉树,所有非叶结点的平衡因子都是0,当且仅当该树是完全二叉树。
单选题
2-1 设栈S和队列Q的初始状态均为空,元素{1, 2, 3, 4, 5, 6, 7}依次进入栈S。若每个元素出栈后立即进入队列Q,且7个元素出队的顺序是{2, 5, 6, 4, 7, 3, 1},则栈S的容量至少是:
2-2 使用迪杰斯特拉(Dijkstra)算法求下图中从顶点1到其他各顶点的最短路径,依次得到的各最短路径的目标顶点是:
2-3 将1~6这6个键值插到一棵初始为空的二叉搜索树中。如果插入完成后,搜索树结构如图所示,问:可能的插入序列是什么?
2-4 已知一棵二叉树的树形如下图所示,其后序序列为{ e
, a
, c
, b
, d
, g
, f
}。树中与结点a
同层的结点是:
2-5 哈夫曼树是n个带权叶子结点构成的所有二叉树中()最小的二叉树。
2-6 设一个栈的输入序列是1、2、3、4、5,则下列序列中,是栈的合法输出序列的是?
2-7 给定输入序列 {4371, 1323, 6173, 4199, 4344, 9679, 1989} 以及散列函数 h(X)=X%10。如果用大小为10的散列表,并且用分离链接法解决冲突,则输入各项经散列后在表中的下标为:(-1表示相应的插入无法成功)
2-8 在并查集问题中,已知集合元素0~8所以对应的父结点编号值分别是{ 1, -4, 1, 1, -3, 4, 4, 8, -2 }(注:−n表示树根且对应集合大小为n),那么将元素6和8所在的集合合并(要求必须将小集合并到大集合)后,该集合对应的树根和父结点编号值分别是多少?
2-9 数据结构中Dijkstra算法用来解决哪个问题?
2-10 将 9, 8, 7, 2, 3, 5, 6, 4 顺序插入一棵初始为空的AVL树。下列句子中哪句是错的?
2-11 在拓扑排序算法中用堆栈和用队列产生的结果会不同吗?
2-12 将 { 10, 12, 1, 14, 6, 5, 8, 15, 3, 9, 7 } 逐个按顺序插入到初始为空的最小堆中,然后连续执行两次删除最小元素操作(DeleteMin),再插入4,16,此后堆顶的元素是什么?
答案:A
2-13 给定散列表大小为17,散列函数为H(Key)=Key%17。采用平方探测法处理冲突:hi(k)=(H(k)±i2)%17将关键字序列{ 23, 22, 7, 26, 9, 6 }依次插入到散列表中。那么元素6存放在散列表中的位置是:
2-14 要判断一个整数N(>10)是否素数,我们需要检查3到√N之间是否存在奇数可以整除N。则这个算法的时间复杂度是:
2-15 给定一有向图的邻接表如下。若从v1开始利用此邻接表做广度优先搜索得到的顶点序列为:{v1, v3, v2, v4, v5},则该邻接表中顺序填空的结果应为:
2-16 已知一个图的邻接矩阵如下,则从顶点V1出发按深度优先搜索法进行遍历,可能得到的一种顶点序列为:
2-17 将序列{ 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-18 在一个链队列中,front和rear分别为头指针和尾指针,则插入一个结点s的操作为( )。
2-19 将 {28, 15, 42, 18, 22, 5, 40} 逐个按顺序插入到初始为空的最小堆(小根堆)中。则该树的前序遍历结果为:
2-20 给定初始待排序列{ 15,9,7,8,20,-1,4 }。如果希尔排序第一趟结束后得到序列为{ 15,-1,4,8,20,9,7 },则该趟增量为:
2-21 给出关键字序列{ 4321, 56, 57, 46, 28, 7, 331, 33, 234, 63 },下面哪个选择是按次位优先(LSD)链式基数排序进行了一趟分配和收集的结果? (2分)
2-22 给定有权无向图的邻接矩阵如下,其最小生成树的总权重是:
程序填空题
5-1 本函数的功能是从有N
个元素的线性表A
中查找第K
小的元素。函数的初始调用为Qselect(A, K, 0, N-1)
。请完成下列填空。
这题没拿不到满分
ElementType Qselect( ElementType A[], int K, int Left, int Right )
{
ElementType Pivot = A[Left];
int L = Left, R = Right+1;
while (1) {
while ( A[++L] < Pivot ) ;
while ( A[--R] > Pivot ) (4分);//填空处
if ( L < R ) Swap( &A[L], &A[R] );
else break;
}
Swap( &A[Left], &A[R] );
if ( K < (L-Left) )
(5分);//填空处,这里错了就不给了
else if ( K > (L-Left) )
return Qselect(A, K-R, R+1, Right)
;
else
return Pivot;
}
5-2 下列代码的功能是计算给定二叉树T
的宽度。二叉树的宽度是指各层结点数的最大值。函数Queue_rear
和Queue_front
分别返回当前队列Q
中队尾和队首元素的位置。
typedef struct TreeNode *BinTree;
struct TreeNode
{
int Key;
BinTree Left;
BinTree Right;
};
int Width( BinTree T )
{
BinTree p;
Queue Q;
int Last, temp_width, max_width;
temp_width = max_width = 0;
Q = CreateQueue(MaxElements);
Last = Queue_rear(Q);
if ( T == NULL) return 0;
else {
Enqueue(T, Q);
while (!IsEmpty(Q)) {
p = Front_Dequeue(Q);
temp_width++ (3分); //填空处
if ( p->Left != NULL ) Enqueue(p->Left, Q);
if ( p->Right != NULL ) Enqueue(p->Right, Q) (3分); //填空处
if ( Queue_front(Q) > Last ) {
Last = Queue_rear(Q);
if ( temp_width > max_width ) max_width = temp_width;
temp_width=0 (3分); //填空处
} /* end-if */
} /* end-while */
return max_width;
} /* end-else */
}
编程题
7-1 根据后序和中序遍历输出先序遍历 (8分)
本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。
输入格式:
第一行给出正整数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
//本题来源网络! ! 注意编译器是C++(g++)
#include<bits/stdc++.h>
using namespace std;
int mid[33],post[33];
typedef int Status;
//树的储存结构定义
typedef struct BiTNode{
int data;//结点的值
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
BiTree Creat(int *mid,int *post,int n){//根据后序和中序求出树
if(n<1)return NULL;//如果输入出错
int *p = mid;//寻找中序中的根结点
while(p){
if(*p== *(post+n-1))
break;
p++;
}//p为中序中第一个根结点
BiTree T =(BiTree)malloc(sizeof(BiTNode));//开辟空间
T->data=*p;//p为第一个根结点
int len = p-mid;
//递归
T->lchild= Creat(mid,post,len);
T->rchild = Creat(p+1,post+len,n-len-1);
return T;
}
void Print(BiTree T){
if(T){
cout<<" "<<T->data;
Print(T->lchild);
Print(T->rchild);
}
return;
}
int main(){
int n;
BiTree T;
cin>>n;
//输入两个储存后序和中序的数组
for(int i=0;i<n;i++){
cin>>post[i];
}
for(int j=0 ;j < n;j++){
cin>>mid[j];
}
T = Creat(mid,post,n);
//将树前序输出
cout<<"Preorder:";
Print(T);
}