对于很多人来说,字典和数组是非常熟悉也经常用的数据结构。链表也还算比较常用。
他们的特点如下:
1. 字典和数组都是线性结构
2. 字典和数组,链表都是按照位置来存储数据的,例如字段是通过哈希计算下标,数组是使用下标,链表则是一个一个的链接在一起
3. 字典和数组,链表都是 实现的几乎都是一对一的结构,既数据之间的关系的关系是一一对应。
树
我们可以看出,上述的数据结构几乎是一对一的,而实际中常常存在一对多或者是多对多的情况。
例如:
组织结构
流程框图
我们可以看到,这些结构都是存在一对多的情况,注意其中不存在多对一的情况。
他们的结构就像是树一样,从一个根伸展出多个枝干,而每个枝干还可以伸展出更多的枝干,最终在枝干上可以生出很多的叶子
其对应的结构为
数是由节点组成,就是数组是由元素组成,数目n>=0。当节点的数目为0时,表示的是一个空树。如果节点数目不为0那么我们可以看到:
- 树有一个唯一的根节点,也就是所有分支的出发点,节点之间的上下级关系称为父节点和子节点、。
- 树的节点是由有限个节点组成,而每个子节点又是由其他节点集合组成,可以称之为子树。
- 没有子节点而处于末端的节点,我们称之为叶子节点,就像是树干上的树叶一样。
树将最大的层次成为树的深度,即有几级节点。
图
树是一对多的情况,那么多对多又是什么样子呢。试想我们生活中的例子,最直接的就是地图导航,条条大路通罗马,我们道路四通八达,可以达到同一个目的的方法多之又多。
有很多问题我们可以把它们之间的关系抽象为点和线的方式。点则是表示一个事物,线则是表示两个点之间的关系
这是一个与树不同的结构,他允许多个节点连接同一个结构,复杂的关系构成了一个图形,我们称之为“图“。而我们曾听说的图论就是以“图”为研究对象的一个数学分支。图论里的绝大部分问题都是源于实际,从实际问题中抽象出点与线的集合进行分析。例如最短计算,特定路径查找,图的分割等等。
在图中根据不同的特征分为一下几种:
1. 如果节点直接的关系是有方向的,则称之为有向图
2. 如果任何两个节点都是直接或间接可以到达的,则称之为连通图。第二个明显不是连通图
连通图还有有向图和无向图的单独定义。在有向图中,由于节点之间的关系是有方向的,当任意两个节点是互相连通的(a->b,b->a),则称之为强连通图。
在此基础上,如果一个图不是强连通图,但是其包含的最大连通子图具有强连通图的性质,则称该子图为强连通分量。
下面的两个图中都可以找到这样的子图。
关于图的几种基本概念都比较简单扼要的说了一下。概念可能说的不是很确切,但是这样理解起来很方便,具体的就日后慢慢说。
总结
关于树和图的结构,还是那句话:数据结构是为了解决实际生活中遇到的问题才被创造出来的,所以只有了解它的基础原理,才能够明白可以在哪里用?怎么用?。用树作比方,树可以用做排序,可以用来哈夫曼编码,可以用来数据库的索引方法,可以用来词频统计,这些我们是不是从来都没接触过呢。
而图的作用也十分巨大,我们互联网的路由器交错相连,运输路线和导航路线的控制,电路板的设计,这些的等等都可以抽象为图,从而使用图算法解决某些存在问题。
一部分图像引用:
https://www.applysquare.com/topic-cn/54mufHeAc/
http://blog.sina.com.cn/s/blog_12bcdd96c0102xuzr.html
https://www.it610.com/article/2553476.htm
https://www.cnblogs.com/mcomco/p/10304383.html