DS|数据结构||第五章小结

本章主要学习了树和二叉树相关知识,包括二叉树的性质和存储结构(双亲表示法、孩子表示法、孩子兄弟法),二叉树的前、中、后序遍历算法等,还了解了哈夫曼树和哈夫曼编码的构造方法,以及森林与二叉树之间的相互转换方法。

实验课老师带领我们做了“深入虎穴”这道题:

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 typedef struct{
2     int doors;//门的数量
3     int *p;//指向后面的门的编号序列
4 }node;

代码由多个实现不同功能的函数构成。

  1. 读入门的信息,返回根所在的门牌号

     1 int Input(node *a, int n){//读入n扇门的信息给a数组,返回根所在的门牌号(下标)
     2     int i,j;
     3     bool *vi;
     4     vi=new bool[n+1];
     5     for(i=1;i<=n;++i)//初始化vi数组的全部元素为false
     6         vi[i]=false;
     7     for(i=1;i<=n;++i){//读入n扇门的信息
     8         cin>>a[i].doors;
     9         if(a[i].doors!=0){
    10             a[i].p=new int[a[i].doors];//为a[i].p申请空间
    11             for(j=1;j<=a[i].doors;++j){
    12                 cin>>a[i].p[j-1];
    13                 vi[a[i].p[j-1]]=true;
    14             }
    15         }
    16         else//doors为0
    17             a[i].p=NULL;
    18     }
    19     for(i=1;i<=n;++i)//找根节点所在的下标
    20         if(!vi[i]) return i;
    21 }

  2. 利用层次遍历得到树最深的结点,返回遍历的最后一个节点的编号

     1 int Level(node *a, int r){//从a[r]开始对a进行层次遍历,并返回遍历的最后一个节点的编号
     2     queue<int> q;
     3     int t;
     4     q.push(r);
     5     while(!q.empty()){
     6         t=q.front();
     7         q.pop();
     8         if(a[t].doors!=0){//t号门后面还有门,后面的门入队
     9             for(int i=0;i<a[t].doors;++i)
    10                 q.push(a[t].p[i]);
    11         }
    12     }
    13     return t;
    14 }

  3. 最后是主函数

     1 int main(){
     2     node *a;//a用于存储整棵树
     3     int i,j,k;
     4     int n,root;
     5     cin>>n;
     6     a=new node[n+1];
     7     root=Input(a,n);
     8     cout<<Level(a,root)<<endl;
     9     return 0;
    10 }

这次实验课后,感觉自己思考、入手问题的能力有所加强,分析问题能力也有所提高,但是打代码的能力还是比较弱,因此还是要自己多多练习,另外本章的概念比较多也难懂,要再多花时间看看书本,熟悉所有概念。

原文地址:https://www.cnblogs.com/Daylight-Deng/p/10810430.html

时间: 2024-11-05 20:27:57

DS|数据结构||第五章小结的相关文章

[Java Concurrency in Practice]二至五章小结

下面这个"并发技巧清单"列举了在第一部分(二至五章)中介绍的主要概念和规则. 可变状态是至关重要的(It's the mutable state,stupid). 所有的并发问题都可以归结为如何协调对并发状态的访问.可变状态越少,就越容易确保线程安全性. 尽量将域声明为final类型,除非需要它们是可变的. 不可变对象一定是线程安全的. 不可变对象能极大地降低并发编程的复杂性.它们更为简单而且安全,可以任意共享而无须使用加锁或保护性复制等机制. 封装有助于管理复杂性. 在编写线程安全的

11.5 第十五章小结

这一章的主题主要是函数程序的重构,我们已经看到了大量的示例和概念.我们首先讨论了在数学意义上的重构,可以发现,在数学意义上,很容易推导出"代码",因此,可以看到特定的改变在何时是正确的.由于其根源在数学中,因此,函数式编程通常也有这样的属性. 我们首先探讨了使用函数类型,能够减少代码重复,这是重构的简单情况:然后发现,使用函数式编程,能够方便跟踪代码中的相关性,因此,我们可以看到特定的重构是否是正确的. 接下来,我们重点关注使用 xUnit.net 进行函数式编程的单元测试.学会组合单

【数据结构】第二章小结

ps:第一次用博客园写,记录第一次 一.数据结构第二章主要为:顺序表和链表的构造及其增删查改的一些基本操作,以及粗略计算它们的时间or空间的复杂度. 1.顺序表: (1)  特点:逻辑结构上相邻,物理存储上也是相邻的,属于随机存储: (2)  优点:便于使用下标进行查找,例如:查找某数组的第6项的数据是几: 存储密度为1: (3)    缺点:由于其物理存储相邻,故无法将空间中零零散散的碎片空间利用起来: 2.链表: (1)   特点:逻辑结构上相邻,物理存储上不一定相邻的,属于顺序存储: 单链

数据结构第四章小结

任选本章一道题目,谈谈你解决该题的心得体会.同时谈谈你对上次制定目标的完成情况, 以及接下来的目标. 一.第四章主要学习了串,我觉得最重要的两个内容,一个是AI核心代码,一个是稀疏矩阵的十字链表压缩存储:AI核心代码呢,老师在课堂上讲了一部分,自己也接受了挺多的,当天我就趁热打铁在通识课上回味了一下,老师有留给我们自己完成can you 的那一部分内容,之前有一部分是you变成I,我参照着之前的自己写了一遍,但是一开始出现了错误,又重新写了好几遍,但是总是会出现warning,可能是溢出的问题,

算法第五章小结

一.回溯算法的概念以及理解 概念:回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标. 理解:在回溯法中,每次扩大当前部分解时,都面临一个可选的状态集合,新的部分解就通过在该集合中选择构造而成.这样的状态集合,其结构是一棵多叉树,每个树结点代表一个可能的部分解,它的儿子是在它的基础上生成的其他部分解.树根为初始状态,这样的状态集合称为状态空间树. 二.“子集和”问题的解空间结构和约束函数 1.解空间结构 非负非零的整数集合 S = {x1, x2, …, xn}

(数据结构第五章)广义表的头尾链表存储表示

/*********广义表的头尾链表存储表示**************/ #include<cstdio> #include<algorithm> using namespace std; typedef int AtomType; ///定义AtomType为int类型 typedef enum { ATOM, LIST } ElemTag; ///ATOM==0; 原子,LIST==1:子表 typedef struct FLNode { ElemTag tag; ///公共

(数据结构第五章)行逻辑链接的顺序表

/*******************行逻辑链接的顺序表*****************/ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MAXSIZE 12500 /// 假设非零元个数最大值为12500 #define MAXRC 12500 ///假设的每行的个数的最大值12500 #define ERROR -1 typedef stru

[数据结构]第五章习题作业

1. 已知下图是一个森林的孩子-兄弟表示法的存储结构,画出这个森林的逻辑图. A B C D E F G H I J 2. 下面的二叉树,请为它建立中序遍历线索.已知一指针p指向E,问从p出发利用线索找到E的第4个后继节点,需要访问几次二叉树的节点(重复访问的也计算在内,E点不算)? 3. 已知一个二叉树的先序遍历结果是:a b d e g c f h,中序遍历的结果是:d b e g a c h f .问后序遍历的结果将是什么? 4. 将数组13,5,10 ,7,27,9,4,15,33,20

数据结构——第五章 树与二叉树

树是一对多的结构 结点:树的小圆圈 度:结点有多少个分叉 叶子结点:结点的度为0 双亲:parent 孩子:child 二叉树:树的度不超过2 满二叉树:每一层都是满的 完全二叉树:除了最后一层都是满的,最后一层左边都是齐全连续的. 性质1:对一颗二叉树,第i层最多有2的i-1次方个 性质2:对一颗二叉树,最多有2的i次方-1个 性质3:n0=n2+1 n0+n1+n2=n(n0--结点度为0的个数,n2--结点度为2的个数) 性质4:具有n个结点的完全二叉树深度为 math.floor(log