中国大学MOOC-陈越、何钦铭-数据结构-2019春期末考试(题目+部分解答)


一、判断题

思路很正常的题目。

1-4反例:4个顶点只用3条边就可以做到全连通。所以边数可能等于顶点个数减一。错误。

 

二、选择题

2-8需要细心的做一下双旋操作,

2-12 C

再散列即是double扩大原表长,使得loading factor(α)下降一半的过程。因为装载因子和期望查找长度有反相关的关系(参考数据结构第三版 散列性能分析章节的一张曲线图),所以降低α这样可以增加散列查找的效率。

本题中再散列后的表长应该是20,但是要取大于20的第一个素数,所以表长取23较适宜。所以选C,而不是A。

2-14 此题有争议 C、D 当初是看错选对的,看书上的意思应该选C? 求大佬指正。

2-20 三角不等式在图论中同样也适用,两边之和必定大于第三边。

2-21 图退化成线性表后,堆栈和队列的拓扑排序就相同。

三、程序填空题

++counter //TopNum starts counting from 1

--Indegree[W]

这个堆的应用很聪明,就是找出K个尽可能小的数字,再在其中选一个最大的数即为第K小的数。

建立了K个元素的大顶堆利用不等式的传递性质。如果一个数大于堆顶,那其必定大于堆顶以下的元素,那这个数至少是第K+1小的数(因为比K+1个数还大),所以在循环中直接跳过该数;如果一个数小于堆顶,则完成替换堆顶+调整最大堆的操作,使得最大堆里永远是较小的一堆数字。

四、编程题

7-1 根据后序和中序遍历输出先序遍历 (8 point(s))

本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。

输入格式:

第一行给出正整数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

陈越老师一道讲过的课后习题

思路:

申请三个全局数组。PostOrder、InOrder、PreOrder。

依据PostOrder找到根节点后记录,查找InOrder中的根节点,把InOrder原序列划分成左右两个子序列;递归解决问题。

参考代码:

 1 #include <cstdio>
 2 #define MAXN 50
 3 
 4 int pre[MAXN], in[MAXN], post[MAXN];
 5 
 6 
 7 
 8 void InputPostAndIn(int N);
 9 void solve(int preL, int inL, int postL, int n);
10 void OutputPost(int N);
11 
12 int main()
13 {
14     int N; scanf("%d", &N);
15     InputPostAndIn(N);
16     solve(0, 0, 0, N);
17     OutputPost(N);
18 }
19 
20 void InputPostAndIn(int N)
21 {
22    
23     for (int i=0; i<N; i++) {
24         scanf("%d", &post[i]);
25     }
26     for (int i=0; i<N; i++) {
27         scanf("%d", &in[i]);
28     }
29     
30 }
31 
32 void solve(int preL, int inL, int postL, int Num)
33 {
34     if (Num == 0) {
35         return;
36     }
37    
38     int root, i, LTreeNodeNum, RTreeNodeNum;
39     root = post[postL + Num - 1];
40     pre[preL] = root;
41     
42     for (i=inL; in[i]!=root; i++) {}
43     
44     LTreeNodeNum = i - inL; RTreeNodeNum = Num - LTreeNodeNum - 1;
45     
46     solve(preL+1, inL, postL, LTreeNodeNum);
47     solve(preL+1+LTreeNodeNum, inL+1+LTreeNodeNum, postL + LTreeNodeNum, RTreeNodeNum);
48 }
49 
50 void OutputPost(int N)
51 {
52     printf("Preorder: ");
53     printf("%d", pre[0]);
54     for (int i=1; i<N; i++) {
55         printf(" %d", pre[i] );
56     }
57     printf("\n");
58 }
View Code

猜你喜欢

转载自www.cnblogs.com/acoccus/p/10957065.html