树
树是一种数据结构,它是由有限节点组成一个具有层次关系的集合,类似一颗倒置的大树。
当节点数为 0 时,该树被称为空树。
树的节点
定义:使用树节点储存的每一个数据元素都被称为节点。
- 根节点:每个节点只有一个前件,称为父节点,而没有前件的节点称为根节点。一颗非空的树有且仅有一个根节点
- 子节点:每个节点可以有多个后件,称为该节点的子节点。
- 叶子节点:没有后件的节点称为叶子节点。
- 子树:树的其中一个节点及其下面所有节点构成的树称为子树。
度与层次
以下图树为例:
节点
- 度:节点的度是指该节点的孩子数量。例如:A节点的度为3,B节点的度为2。
- 层次:从根节点开始, 根为第 1 层, 根的子节点为第 2 层, 以此类推。例如:G节点在第三层。
- 深度:根节点到该节点路径所包含的边数。例如:M节点的深度为3,F节点的深度为2。
- 高度:该节点到叶子节点最长路径的边数。例如:D节点的高度为2。
树
- 度:一颗树所包含所有节点的度的最大值。例如:该树的度为3。
- 高度(深度):一棵树节点的最大层次。例如:该树的高度(深度)为3。
树的特点
- 一棵树中任意两个节点有且仅有一条路径相连,不包含回路。
- 一个有n个节点的树,一定有n-1条边。
二叉树
二叉树是一种特殊的有序树,二叉树的度为2。二叉树的子节点又被分为:左孩子节和右孩子节点
如上图所示,左图树的度为2,为二叉树。右图树的度为3,非二叉树
其中在左图中,节点4为节点2的左孩子节点,节点5为节点2的右孩子节点。
二叉树的分类
二叉树被分为:满二叉树和完全二叉树
满二叉树
概述:当一颗二叉树除叶子节点外,其余所有节点的度都为2,那么这颗树就被称为满二叉树。如下图所示:
性质:
- 假设一颗满二叉树的高度为
,那么该树的总节点数为:
。如上图:该树高度为4,则总节点数为15
- 一颗满二叉树的第
层节点数为:
。如上图:第三层的节点数为4
- 具有
个节点的满二叉树,它的叶子节点个数为:
,高度(深度)为
。如上图:该树总节点数为15,则该树的叶子节点数为8,高度(深度)为4
完全二叉树
概述:完全二叉树是指当二叉树除过最后一层为满二叉树且最后一层的节点从左到右依次分布,如下图所示:
性质:
- 父节点与子节点的序号有对应关系。父节点为
时 ,左孩子节点为
右孩子节点为
。例如上图中节点为2的左孩子节点为4,右孩子节点为5
二叉树的储存
二叉树的储存分为:链式储存和顺序储存
链式储存
二叉树的链式储存与链表类似,依靠指针管理节点之间的关联,不需要连续的存储空间,每个节点包括3个属性:数据(Data)、左孩子节点指针(Left)、右孩子节点指针(Right)
顺序储存
二叉树的顺序储存,是指用顺序表(数组)储存,在顺序储存中,数组的每一个位置仅储存节点的数据,不需要储存节点的指针,而子节点的储存位置是根据完全二叉树的性质 “父节点为 时 ,左孩子节点为
,右孩子节点为
” 来确定下标的。例如:父节点在数组中的下标为
,那么该节点的左孩子节点在数组中的下标就是
,而右孩子节点在数组中的下标为
顺序储存更适用与储存完全二叉树,而不适应与储存普通二叉树,原因是储存完全二叉树会使二叉树中元素在数组中连续储存,而储存普通二叉树容易在数组中出现空隙,从而导致内存浪费。如图所示:
二叉树的遍历
二叉树的遍历分为:前序遍历、中序遍历、右序遍历
- 前序遍历也叫先序遍历,就是先输出根节点,在遍历左子树,最后遍历右子树:根节点=>左子树=>右子树
- 中序节点是先递归中序遍历左子树,在输出根节点,最后递归中序遍历右子树:左子树=>根节点=>右子树
- 后序节点是先递归后序遍历左子树,在递归后序遍历右子树,最后输出根节点:左子树=>右子树=>根节点
以下图为例:
- 前序遍历(根左右):ABDECFG
- 中序遍历(左根右):DBEAFCG
- 后序遍历(左右根):DEBFGCA