zoukankan      html  css  js  c++  java
  • 第五章学习小结

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

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

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

    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

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

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

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

  • 相关阅读:
    Nginx+IIS+Redis 处理Session共享问题 2
    Nginx+IIS+Redis 处理Session共享问题 1
    [ZooKeeper.net] 1 模仿dubbo实现一个简要的http服务的注册 基于webapi
    使用小技巧使子功能模块不污染主框架
    sqlserver 去除重复的行数据
    setsockopt用法详解
    windows 非窗口定时器
    Redis list 之增删改查
    王垠:如何掌握程序语言(转)
    【练习】整树转换为16进制的字符串的函数
  • 原文地址:https://www.cnblogs.com/yuanchuying/p/10810518.html
Copyright © 2011-2022 走看看