目录
1.树形结构
之前的内容介绍的都是线性结构,从今天开始,我们要介绍另外一种数据结构类型——树形(层次)结构,它是一种非线性的存储结构。
那他们之间有什么区别呢?
线性结构:(一对一)一个数据元素若有直接前驱,只能有一个直接前驱
层次结构:(一对多)一个数据元素若有直接后继,可以有多个直接后继
2.树的定义
关于树的定义,我们在数据结构中其实只需要形象的理解就可以了,它的严格数学定义要追究到图论中,对于学习数据结构,了解了解就行了。
形象理解
看看图就可以理解了。
我们将⼀对多的关系的集合中的数据元素按照图中的形式进行存储,整个存储形状在逻辑结果上面看,类似于实际⽣活中倒着的树,所以就将这种结构称之为树形结构。
数据结构中的定义
具有相同特性的n个结点(数据元素)的有限集合:
- 若n=0,则称为空树 。否则:
- 存在唯一的称为根的结点root;
- 当n>1时,其余结点可分为m (m>0)个互不相交的有限集T1 , T2 , …, Tm,其中每一个子集本身又是一棵符合本定义的树,称为根root的子树。
- m棵子树的根结点为根root的直接后继
可以看出:这是一种递归的定义方式
图论中的定义
在图论中,我们往往是先学习图,再学习图的一个特例——树,所以,树是根据图来定义的。
那图是什么呢?
一个图是一个有序对(序偶)<V,E>,记为G=<V,E>
点集V:是一个有限的非空集合(存放着这个图中的所有结点)
边集E:是一个有限集合(存放着由V中的不同结点所构成的无序对,且不含重复元素)
那有序对又是什么呢?
恰好有两个元x,y,而且x在前,y在后,这种集合称为有序对,它的元有确定的次序,记作<x,y>。
所以,我认为,一个图就是点集与边集组成的一个关系集合。
那树又是图的一个特例,就是:
树是无圈的连通图。(是不是相当简洁明了,无圈和连通就是我们直观上理解的那个意思:没有环,但从任意一个结点出发,一定可以达到任意的另外一个结点)
它与以下5个定义是等价的,在数学中,我们通常采用循环证明的方式得到:
设T是非平凡图(n,m)
- T无圈且m=n-1
- T连通且m=n-1
- T无圈,但在T中任意两结点之间增加一条新边后有且仅有一个圈
- T连通,但删除T中的任意一条边后,便不连通(n2)
- T中每一对结点之间有且仅有一条道路(n2)
3.树的结点
结点:使用树形结构存储的每一个数据元素都被称为结点,上图中的A、B、C等都是结点
根结点:它是一个特殊的结点,它没有前驱,上图中的A就是根节点
父节点(双亲结点)、子结点、兄弟结点:对于A、B、C、D四个结点来说,A是BCD的父节点,也称双亲结点,BCD是A的子结点,也称孩子结点,BCD之间互称兄弟结点
叶子结点:如果一个结点没有任何子结点,那么它就是叶子结点。比如E、C、G、H、I、J都是叶子结点
结点的度:结点拥有的子树的个数。比如A、F的度为3,B的度为2,D的度为1,其他的度为0
树的度:在各个结点中,结点度的最大值就是树的度。比如,该树的度为3
树的深度(高度):结点的层次从根节点开始定义,根为第一层,根的孩子为第二层,依次类推。该树的深度为4
4.森林
m棵互不相交的树的集合(m0)
可见,蓝色、绿色、黄色各为一棵树,它们不互相交,共同构成了一个森林,但这个森林本身也是一棵树。
所以,对树中的每个结点而言,其子树的集合就是森林。
今天先到这里,下一篇我们来看看怎么用树来存储数据以及完整代码实现。