歡迎評論(指正或是詢問都可),謝謝大家
一、判斷題
思路很正常的題目。
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 }