欢迎评论(指正或是询问都可),谢谢大家
一、判断题
思路很正常的题目。
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 }