第五章学习小结
Posted biss
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第五章学习小结相关的知识,希望对你有一定的参考价值。
第五章学习了树与二叉树的相关知识,有二叉树及其存储结构,二叉树的前中后与层次遍历并且了解了哈夫曼树,最后学习了树与森林的转换。
以下是其中的一道实践题,老师在课堂上详细的给出了解题方法
7-2 深入虎穴 (30 分)
著名的王牌间谍 007 需要执行一次任务,获取敌方的机密情报。已知情报藏在一个地下迷宫里,迷宫只有一个入口,里面有很多条通路,每条路通向一扇门。每一扇门背后或者是一个房间,或者又有很多条路,同样是每条路通向一扇门…… 他的手里有一张表格,是其他间谍帮他收集到的情报,他们记下了每扇门的编号,以及这扇门背后的每一条通路所到达的门的编号。007 发现不存在两条路通向同一扇门。
内线告诉他,情报就藏在迷宫的最深处。但是这个迷宫太大了,他需要你的帮助 —— 请编程帮他找出距离入口最远的那扇门。
输入格式:
输入首先在一行中给出正整数 N(<),是门的数量。最后 N 行,第 i 行(1)按以下格式描述编号为 i 的那扇门背后能通向的门:
K D[1] D[2] ... D[K]
其中 K
是通道的数量,其后是每扇门的编号。
输出格式:
在一行中输出距离入口最远的那扇门的编号。题目保证这样的结果是唯一的。
输入样例:
13
3 2 3 4
2 5 6
1 7
1 8
1 9
0
2 11 10
1 13
0
0
1 12
0
0
输出样例:
12
1 #include <iostream> 2 #include <queue> 3 using namespace std; 4 5 typedef struct{ 6 int doors; //门的数量 7 int *next;//指向后面的门编号序列 8 }node; 9 10 //函数原型声明 11 int input(node *, int ); 12 int level(node *, int ); 13 14 int main() 15 { 16 node *list; //存储整棵树,每扇门后的门 17 18 int i, j, k; 19 int n; 20 cin >> n; 21 22 int root; //根节点 23 24 list = new node[n+1]; //申请树列表的节点个数,按从1到n 25 26 root = input(list, n); //输入,找根 27 28 cout << level(list, root); //参差遍历 29 30 return 0; 31 } 32 33 //读入n扇门的信息,返回根节点所在的下标 34 int input(node *list, int n) 35 { 36 int i, j; 37 38 // 一整个数组找根,并初始化所有元素为false 39 bool *vi; 40 vi = new bool[n+1]; 41 for(i=1; i<=n; i++) 42 { 43 vi[i] = false; 44 } 45 46 //读入n扇门的信息 47 for(i=1; i<=n; i++) 48 { 49 cin >> list[i].doors; //输入当前门通往的门数 50 51 // 当doors不为0 52 if(list[i].doors != 0) 53 { 54 list[i].next = new int[list[i].doors]; //申请下一门的空间 55 56 // 输入下一门的信息 57 for(j=0; j<list[i].doors; j++) 58 { 59 cin >> list[i].next[j]; 60 vi[list[i].next[j]] = true; 61 } //for 62 } //if 63 64 // 当doors为空 65 else list[i].next = NULL; 66 } 67 68 // 遍历找根,返回给主函数 69 for(i=1; i<=n; i++) 70 { 71 if(vi[i] != true) 72 return i; 73 } 74 } 75 76 //从根节点开始(list[root])开始层次遍历,并返回最后一个入队的下标 77 int level(node *list, int root) 78 { 79 int t; 80 queue<int> q; //利用队列 81 q.push(root); //根节点入队 82 83 // 当队列不为空 84 while(q.empty() != true) 85 { 86 // 取队头元素 87 t = q.front(); 88 q.pop(); 89 90 // t号门后面还有门存在,入队 91 if(list[t].doors != 0) 92 { 93 for(int i=0; i<list[t].doors; i++) 94 { 95 q.push(list[t].next[i]); 96 } 97 } 98 } 99 return t; 100 }
首先题目一看上去就像是“树”,自然而然就使用了本章学习的内容,接着老师一开始是使用二维数组来存储,但考虑到时稀疏矩阵,所以选择了结构体数组来存储,这里有一个扩展就是树的存储其实是随心所欲的,可以按照自己的需求建立各种各样的结构体数组来存储他们。
经过这次实验课,分析问题的能力确实有所提高,但动手的能力还是不彳亍。另外,本章的知识有丶难,需要多多温习。
以上是关于第五章学习小结的主要内容,如果未能解决你的问题,请参考以下文章