写在之前
- 树数据结构和数组、链表、栈、队列等数据结构有什么区别?
- 我们知道数据结构有物理结构和逻辑结构,而大部分数据结构都可以使用数组或链表实现,说明物理结构上并没有差异。
- 树和其他数据结构的差异在于逻辑结构,数组、链表、栈、队列的逻辑结构是一对一的,而树的逻辑结构是一对多==(是一对多而不是多对一,树的定义中对于子树的说明限制了只能是一对多,一个结点可以有多个子结点)==。
树
树的示意图
A是根结点
A是B、C、D的父结点,B、C、D是兄弟结点
E、F、G、H、I是叶子结点
没有父结点的结点是根结点,没有子结点的结点是叶子结点
子树
子树是树数据结构中一个很重要的概念,因为树是一种递归的数据结构,因此对于上面那个根结点为A的多叉树,BEF就是它的子树之一:
这里需要注意的是:子树之间不能存在交集,如果存在交集,那么就不是树结构==(这就限制了一个父结点可以有多个子结点,但是一个子结点只能有一个父结点)==。
度
对于一个结点,它拥有的子树的个数是它的度。
- 因此结点A的度是3,结点B的度是2。
树的度:一棵树的度是树中所有结点的度的最大值。
- 上面的树的度是3。
树的高度(深度)
树的层次:一棵树的根结点处于第一层,根结点的子结点处于第二层,根结点的子结点的子结点处于第三层,依次向下。
- 图中结点E处于第三层
树的深度:一棵树的深度是树中结点所在层次的最大值。
- 图中树的深度是3。
兄弟结点:如果两个结点的父结点不同,且两个父结点处于同一层次,那么这两个结点是兄弟结点。
有序树和无序树
有序树:如果规定一个结点的的最左边子结点是第一个子结点,最右边的子结点是最后一个子结点,那么这棵树是一个有序树。
- 如果上图是一个有序树,那么如果交换结点E和结点F的位置,那么就不再是同一棵树。
二叉树
二叉树的特点
二叉树的每个结点的度最多为2。(每个结点的度可以是0,可以是1,也可以是2)
- 上面的图就不是二叉树,而是一个多叉树。
二叉树是有序树。
- 如果交换子结点的位置,那么就不是同一颗二叉树。
真二叉树
真二叉树:所有结点的度要么是0,要么是2。
- 真二叉树和二叉树的区别在于:二叉树中的结点的度可以是1,但真二叉树只能说0或2。
上图是二叉树,但不是真二叉树
上图是真二叉树,因为所有结点的度都是0或2。
满二叉树
满二叉树:满二叉树的所有结点的度要么是0,要么是2,并且所有叶子结点都必须在最后一层。
我们可以看出来,满二叉树就是在真二叉树的基础上增加了要求所有叶子结点都在最后一层的条件
上图是一个满二叉树,满二叉树因为是要求所有叶子结点都在最后一层,且度都是0或2,这就使得满二叉树填满了所有同层次下二叉树定义允许的结点位置。
完全二叉树
完全二叉树:将一个有n个结点的二叉树,将每一个结点按层次顺序编号,所有结点的编号为从1到n。如果这个编号顺序和同样深度的满二叉树的编号从1到n的编号的结点位置相同,那么这个二叉树是完全二叉树。
下图是一个深度为3的满二叉树:
我们需要检查有n个结点的深度为3的二叉树的拥有同样编号的结点是否在同一位置,如:如果编号4的结点不是结点B的最左边子结点,那么不是完全二叉树。
上图是一个完全二叉树,因为拥有从1到4的编号的结点和满二叉树拥有从1到4编号的结点的位置相同。
上图不是完全二叉树。