按Ctrl+F 查询题目答案😄
没查到想要的题目?
这里还有👉 中国大学MOOC-陈越、何钦铭-数据结构-2020春期末考试(1)
判断题
1-1 无向连通图边数一定大于顶点个数减1。
1-2 2N和NN具有相同的增长速度。
1-3 采用平方探测冲突解决策略(hi(k)=(H(k)+i2)%11, 注意:不是±i2),将一批散列值均等于2的对象连续插入一个大小为11的散列表中,那么第4个对象一定位于下标为0的位置。
1-4 若一棵平衡二叉树的所有非叶结点的平衡因子都是0,则其必为完美二叉树。
1-5 对N个不同的数据采用冒泡排序进行从大到小的排序,当元素基本有序时交换元素次数肯定最多。
单选题
2-1 哈夫曼树是n个带权叶子结点构成的所有二叉树中()最小的二叉树。
2-2 给定有权无向图的邻接矩阵如下,其最小生成树的总权重是:
2-3 在拓扑排序算法中用堆栈和用队列产生的结果会不同吗?
2-4 将 9, 8, 7, 2, 3, 5, 6, 4 顺序插入一棵初始为空的AVL树。下列句子中哪句是错的?
2-5 对于序列{ 49,38,65,97,76,13,27,50 },按由小到大进行排序,下面哪一个是初始步长为4的希尔排序法第一趟的结果?
2-6 将 { 10, 12, 1, 14, 6, 5, 8, 15, 3, 9, 7 } 逐个按顺序插入到初始为空的最小堆中,然后连续执行两次删除最小元素操作(DeleteMin),再插入4,16,此后堆顶的元素是什么?
2-7 将1~6这6个键值插到一棵初始为空的二叉搜索树中。如果插入完成后,搜索树结构如图所示,问:可能的插入序列是什么?
2-8 在并查集问题中,已知集合元素0~8所以对应的父结点编号值分别是{ 1, -4, 1, 1, -3, 4, 4, 8, -2 }(注:−n表示树根且对应集合大小为n),那么将元素6和8所在的集合合并(要求必须将小集合并到大集合)后,该集合对应的树根和父结点编号值分别是多少?
2-9 给定散列表大小为17,散列函数为H(Key)=Key%17。采用平方探测法处理冲突:hi(k)=(H(k)±i2)%17将关键字序列{ 23, 22, 7, 26, 9, 6 }依次插入到散列表中。那么元素6存放在散列表中的位置是:
2-10 设栈S和队列Q的初始状态均为空,元素{1, 2, 3, 4, 5, 6, 7}依次进入栈S。若每个元素出栈后立即进入队列Q,且7个元素出队的顺序是{2, 5, 6, 4, 7, 3, 1},则栈S的容量至少是:
2-11 若数据元素序列{ 11,12,13,7,8,9,23,4,5 }是采用下列排序方法之一得到的第二趟排序后的结果,则该排序算法只能是:
2-12 给定一有向图的邻接表如下。从顶点V1出发按深度优先搜索法进行遍历,则得到的一种顶点序列为:
2-13 设一个栈的输入序列是1、2、3、4、5,则下列序列中,是栈的合法输出序列的是?
2-14 已知一棵二叉树的树形如下图所示,其后序序列为{ e
, a
, c
, b
, d
, g
, f
}。树中与结点a
同层的结点是:
2-15 数据结构中Dijkstra算法用来解决哪个问题?
2-16 给出关键字序列{ 4321, 56, 57, 46, 28, 7, 331, 33, 234, 63 },下面哪个选择是按次位优先(LSD)链式基数排序进行了一趟分配和收集的结果?
2-17 要判断一个整数N(>10)是否素数,我们需要检查3到√N之间是否存在奇数可以整除N。则这个算法的时间复杂度是:
2-18 在图中自a点开始进行广度优先遍历算法可能得到的结果为:
2-19 使用迪杰斯特拉(Dijkstra)算法求下图中从顶点1到其他各顶点的最短路径,依次得到的各最短路径的目标顶点是:
2-20 如果循环队列用大小为m
的数组表示,队头位置为front
、队列元素个数为size
,那么队尾元素位置rear
为:
2-21 将 {28, 15, 42, 18, 22, 5, 40} 逐个按顺序插入到初始为空的最小堆(小根堆)中。则该树的前序遍历结果为:
2-22 给定输入序列 {4371, 1323, 6173, 4199, 4344, 9679, 1989} 以及散列函数 h(X)=X%10。如果用大小为10的散列表,并且用分离链接法解决冲突,则输入各项经散列后在表中的下标为:(-1表示相应的插入无法成功)
程序填空题
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);
}