代码改变世界

第五章学习小结

2019-05-04 23:44  shinyshiny  阅读(329)  评论(1编辑  收藏  举报

第五章学习了树与二叉树的相关知识,有二叉树及其存储结构,二叉树的前中后与层次遍历并且了解了哈夫曼树,最后学习了树与森林的转换。

以下是其中的一道实践题,老师在课堂上详细的给出了解题方法

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 }
View Code

 

首先题目一看上去就像是“树”,自然而然就使用了本章学习的内容,接着老师一开始是使用二维数组来存储,但考虑到时稀疏矩阵,所以选择了结构体数组来存储,这里有一个扩展就是树的存储其实是随心所欲的,可以按照自己的需求建立各种各样的结构体数组来存储他们。

经过这次实验课,分析问题的能力确实有所提高,但动手的能力还是不彳亍。另外,本章的知识有丶难,需要多多温习。