第五章学习小结
本章学习了树和二叉树,不同于前几章的一对一的线性结构,树是一种一对多的数据结构,树是已分支关系定义的层次结构
树的遍历是绝大多数操作的核心,可分为前序、中序、后序和层次遍历。遍历函数一般需要运用递归。
以下是实验课上跟随老师实践的一道题目:
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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
在课堂上跟着老师的思路走,自己走的弯路也会比自己摸索的要少,完成题目的效率也会更高。
同时把前两节课的理论运用到实践中,对知识的理解也更深刻了。
学习树带给了我一种全新的视角看待数据,学习越多,思考越深。