码迷,mamicode.com
首页 > 其他好文 > 详细

第五章学习小结

时间:2019-05-05 01:01:30      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:input   描述   mes   item   题目   存储   rap   遍历   hit   

本章学习了树和二叉树,不同于前几章的一对一的线性结构,树是一种一对多的数据结构,树是已分支关系定义的层次结构

树的遍历是绝大多数操作的核心,可分为前序、中序、后序和层次遍历。遍历函数一般需要运用递归。

 

以下是实验课上跟随老师实践的一道题目:

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 
 6 typedef struct {
 7     int doors;//门的数量
 8     int *p;    //指向后面的门的编号序列 
 9 }node;
10 
11 
12 int input(node *a, int n); 
13 int level(node *a, int r);
14 
15 int main()
16 {
17     node *a;    //a用于存储整棵树
18     int n;
19     cin >> n;
20     a = new node[n+1];
21     
22     int root = input(a, n);
23     
24     cout << level(a, root) << endl;
25     
26     return 0;    
27 }
28 
29 int input(node *a, int n)
30 {//读入n扇门的信息给a数组,返回根所在的门牌号(下标) 
31     int i, j;
32     bool *vi;
33     vi = new bool[n+1];
34     for(i=1; i<=n; ++i)    //初始化vi数组的全部元素为false 
35         vi[i] = false;
36      
37     for(i=1; i<=n; ++i){//读入n扇门的信息 
38         cin >> a[i].doors;
39         
40         if(a[i].doors != 0){
41             a[i].p = new int [a[i].doors];//为a[i].p申请数组,变为整型数组 
42             
43             for(j=1; j<=a[i].doors; ++j){
44                 cin >> a[i].p[j-1];
45                 vi[a[i].p[j-1]] = true;
46             }//for_j
47         }//if
48         else//doors = 0
49             a[i].p = NULL; 
50     }//for_i
51     
52     for(i=1; i<=n; ++i) 
53         if(!vi[i])    return i;    //找根结点所在的下标 
54 }
55 
56 int level(node *a, int r)
57 {    //从根结点a[r]开始对a进行层次遍历
58     //并返回遍历(最底层的)最后一个结点的编号 
59     queue<int> q;
60     int t, i;
61     q.push(r);
62     
63     while(!q.empty()){
64         t = q.front();
65         q.pop();
66         
67         if(a[t].doors != 0){//t号门后面还有门 ,后面的门入队 
68             for(i=0; i<a[t].doors; ++i)
69                 q.push(a[t].p[i]);
70         }
71     }
72     
73     return t;
74 }
View Code

在课堂上跟着老师的思路走,自己走的弯路也会比自己摸索的要少,完成题目的效率也会更高。

同时把前两节课的理论运用到实践中,对知识的理解也更深刻了。

学习树带给了我一种全新的视角看待数据,学习越多,思考越深。

第五章学习小结

标签:input   描述   mes   item   题目   存储   rap   遍历   hit   

原文地址:https://www.cnblogs.com/yuanchuying/p/10810518.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!