树(Tree)
一、相关概念
“树”这种数据结构与我们现实中的树十分相似,是一种非线性的数据结构。里面的每个元素我们称之为节点,这里有几个概念:父节点、子节点、兄弟节点、根节点、叶子节点。根据字面意思对照上图是否可以大致理解这几个概念呢?
- 父节点:图中的A、B、C、F节点都可以称为父节点
- 子节点:父节点向下延伸的节点,一个父节点可以有多个子节点,如A节点的子节点为B、C节点
- 兄弟节点:就是属于同一个父节点的子节点,如图中G、H节点同属于C节点,则G、H节点互为兄弟节点
- 根节点:毫无疑问最上边的节点A称为根节点,一棵树的根节点只有一个
- 叶子结点:没有子节点的节点称为叶子节点,即图中的D、E、I、G、H
除了上边的概念之外还有三个比较相似的概念:高度、深度、层
- 高度: 从树的底层向上看,最下边节点所处的是第0层,之后每一层的高度加1,如上图所示,节点I的高度为0,节点D、E、F、G、H的高度为1,节点B、C的高度为2,根节点A的高度为3
- 深度: 与高度相似,只不过是从上往下看,根节点的深度为0,之后向下每一层深度都加1,如上图所示,根节点A的深度为0,B、C节点的深度为1,D、E、F、G、H节点的深度为2,I节点的深度为3
- 层: 层数与上边两个略有不同,起始计数为1,但是跟深度一样都是从上往下看,根节点为第1层,接着往下看,为第2、3、4层
二、二叉树
二叉树,顾名思义就是每个节点最多有两个子节点。分别称为左子节点和右子节点。以此类推,N叉树就是每个节点最多有N个节点
满二叉树:除了叶子节点外,每个节点都有左右两个子节点
完全二叉树:除了最后一层的节点外,其他层节点必须都有左右子节点,此外最后一层的叶子节点都要靠左排列,这样的二叉树叫做完全二叉树
三、二叉树的存储方式
二叉树的存储方式有两种:
- 基于指针或者引用二叉链式存储
- 基于数组的顺序存储
链式存储:
如上图所示,链式存储法每个节点有三个部分,data区域存储数据,left和right分被是指向左子节点和右子节点的指针。我们只要知道根节点的位置,就可以一层一层的知道每层节点的位置。大部分的二叉树都是通过这种结构来实现的。
数组存储法:
如果节点x存储在数组中下标为i的位置,下标为2*i的位置存储的就是左子节点,下标为2*i+1的位置存储的就是右子节点。反过来,下标为i/2的位置存储就是它的父节点。通过这样的方法只要知道父节点就可以按规律计算出来其他的节点。正因为如此,所以完全二叉树采用数组存储的方式能够提高空间的利用率,并且不用像链表一样需要额外的空间来存储指向两个子节点的指针,仅仅是浪费一个空间。为什么要空出来数组的第一个位置呢?这样做是为了简化计算,从而可以根据根节点快速的计算出其它节点。如果不想浪费第一个空间,把第一个空间也用上,也可以根据规律推出相应的计算公式,但理解起来可能不如这种方式简单。
三、二叉树的遍历
常规的二插树遍历有三种方法:前序遍历、中序遍历、后续遍历
前序遍历: 前序遍历的“前序”指的是父节点的遍历顺序为最前边,也就是先遍历父节点,然后左节点,最后右节点。对应上图的遍历顺序就是A、B、D、I、F、J、C、G、H
中序遍历: 中序遍历就是父节点遍历的顺序处在左右子节点的中间,即先遍历左子节点,再遍历父节点,最后遍历右子节点。对应上图的遍历顺序就是I、D、B、J、F、A、G、C、H
后序遍历: 后序遍历就是父节点的遍历顺序在其与两个子节点中处于最后,即先遍历左子节点,再遍历右子节点,最后遍历父节点。对应上图的遍历顺序就是I、D、J、F、B、G、H、C、A
二叉树的三种遍历顺序对应的代码实现我在这里做阐述,但基本思路就是递归,以父节点和左右子节点为一组进行递归。
以上所述为本人在学习过程中所做的总结,如有不正确的地方还请各位大佬指出,谢谢!!!