中国大学MOOC-陈越、何钦铭-数据结构-2022春期末考试

Ctrl+F 查询题目答案😄

没查到想要的题目?


这里还有👉中国大学MOOC-陈越、何钦铭-数据结构-2020春期末考试(2)


判断题

1-1 无向连通图边数一定大于顶点个数减1。

1-2 若用平方探测法解决冲突,则插入新元素时,若散列表容量为质数,插入就一定可以成功。

1-3 对N个不同的数据采用冒泡排序进行从大到小的排序,当元素基本有序时交换元素次数肯定最多。 

1-4 N​2​​logN和NlogN​2​​具有相同的增长速度。

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 已知一棵二叉树的树形如下图所示,其后序序列为{ eacbdgf }。树中与结点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。采用平方探测法处理冲突:h​i​​(k)=(H(k)±i​2​​)%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_rearQueue_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);


}

没查到想要的题目?

这里还有👉中国大学MOOC-陈越、何钦铭-数据结构-2020春期末考试(2)


帅哥美女总会随手点赞👍👍👍

帅哥美女总会随手点赞👍👍👍

帅哥美女总会随手点赞👍👍👍


版权声明:本文为Young_IT原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。