一.树
树结构是一种非线性储存结构(数据元素之间存在一对一的线性关系),存储的是具有“一对多”关系的数据元素的集合!
图1就是一个树结构!图1是使用树结构存储的集合 {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} 的示意图。对于数据 1 来说,和数据2、3 有关系;对于数据 4 来说,和 8、9 有关系。这就是“一对多”的关系。将具有“一对多”关系的集合中的数据元素按照上图的形式进行存储,整个存储形状在逻辑结构上看,类似于实际生活中倒着的树(图2倒过来),所以称这种存储结构为“树型”存储结构。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a07b4a92cb56e00a99aaf5318cf22270.png#pic_center)
1.树的结点
- 结点:使用树结构存储的每一个数据元素都被称为“结点”。例如,图 1中,数据元素 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15都是是一个结点。
- 父结点:图1中,1就是2、3的父结点。
- 子结点:图1中,2、3是1的子结点。
- 兄弟结点:图1中,2、3, 4、5, 6、7都是兄弟结点。
- 根结点:每一个非空树都有且只有一个被称为根的结点。图1中,结点1就是整棵树的根结点,如果一个结点没有父结点,那么这个结点就是整棵树的根结点。
- 叶子结点:如果结点没有任何子结点,那么此结点称为叶子结点(叶结点)。例如图1中,结点 8、9、10、11、12、13、14、15都是这棵树的叶子结点。
2.树的度,层次和深度
- 度:对于一个结点,拥有的子树数(结点有多少分支)称为结点的度(Degree)。例如,图1中,根结点 1下分出了 2个子树,所以,结点 1 的度为 2。一棵树的度是树内各结点的度的最大值,所以图1整棵树的度的值是 3。
- 层次:从一棵树的树根开始,树根所在层为第一层,根的孩子结点所在的层为第二层,依次类推!图1中层次为4.
- 深度:一棵树的深度(高度)是树中结点所在的最大的层次。图1树的深度为 4。
3.有序树和无序树
如果树中结点的子树从左到右看,谁在左边,谁在右边,是有规定的,这棵树称为有序树;反之称为无序树。在有序树中,一个结点最左边的子树称为"第一个孩子",最右边的称为"最后一个孩子"。
4.什么是子树?
如图 1中,整棵树的根结点为结点 1,而如果单看结点 2、4、5、8、9、10、11 组成的部分来说,也是棵树,而且节点 2 为这棵树的根结点。所以称 2、4、5、8、9、10、11 这几个结点组成的树为整棵树的子树,同样,结点 4、8、9构成的也是一棵子树,根结点为 4。注意:单个结点也是一棵树,只不过根结点就是它本身。图 1中,结点 8、9、10、11 等都是树,且都是整棵树的子树。
树也可以这样定义:树是由根结点和若干棵子树构成的.
5.树和图有什么区别?
- 树是没有环的图,图不一定是树。
- 树是图的子集。
- 树有一个根节点,图没有。
- 树有层次划分,图没有。
- 树可以递归遍历,图不一定。
- 树是一种“层次”关系,图是“网络”关系。
- 在图中结点之间的关系是任意的,任何两个结点都可能相关。
图3 无向图
二.二叉树
1.二叉树满足的基本条件
- 必须是有序树。
- 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2。
2.二叉树特性
- 在第i层上的结点数必须小于等于2i-1。
- 如果深度为i,那么所有的结点数小于等于2i-1。
- 度数为0的结点数(叶子结点数)=度数为2的结点数+1。
3.满二叉树
如果二叉树中除了叶子结点,每个结点的度都为 2,则此二叉树称为满二叉树。图1就是个满二叉树。满二叉树除了满足普通二叉树的特点,还具有以下特点:
- 深度为 i的满二叉树必有 2i-1 个节点 ,叶子数为 2i-1。
- 满二叉树中不存在度为 1 的节点,每一个分支点中都两棵深度相同的子树,且叶子节点都在最底层。
- 具有 n 个节点的满二叉树的深度为 log2n+1。
图4 满二叉树!
4.完全二叉树
如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。
图5最后一层的节点没有按照从左向右分布,因此只能算作是普通的二叉树。
对于任意一个完全二叉树来说,对于任意一个结点 i ,完全二叉树还有以下几个结论成立:
- 当 i>1 时,父亲结点为结点 [i/2],其中[i/2]表示i/2取整 。(i=1 时,表示的是根结点,无父亲结点)。
- 如果 2i >n(总结点的个数) ,则结点 i 肯定没有左孩子(为叶子结点);否则其左孩子是结点 2i 。
- 如果 2i+1>n ,则结点 i 肯定没有右孩子;否则右孩子是结点 2i+1 。
- 具有n个结点的完全二叉树的深度至少为[log2n]+1,其中[log2n]表示log2n的整数部分。