中國大學MOOC-陳越、何欽銘-數據結構-2019春期末考試(題目+部分解答)


 歡迎評論(指正或是詢問都可),謝謝大家

一、判斷題

思路很正常的題目。

1-4反例:4個頂點只用3條邊就可以做到全連通。所以邊數可能等於頂點個數減一。錯誤。

 

二、選擇題

 

 

2-8需要細心的做一下雙旋操作,

 

 

2-12 C 

設數字 {4371, 1323, 6173, 4199, 4344, 9679, 1989} 在大小為10的散列表中根據散列函數 h(X)=X%10得到的下標對應為 {1, 3, 4, 9, 5, 0, 2}。那么繼續用散列函數 “h(X)=X%表長”實施再散列並用線性探測法解決沖突后,它們的下標變為:(4分)

 

再散列即是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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM