二叉树
二叉树是n(n>=0)个结点的有限集合,二叉树中的节点最多只能有两个子结点。
二叉树的特点:
- 每个节点最多有两个子树,所以每个节点最多只能有两个子结点。
- 左子树和右子树是有顺序的,次序不能任意颠倒。
- 即使树中某个节点只有一棵子树,也需要区分它是左子树还是右子树。
二叉树具有五种基本形态:
- 空二叉树
- 只有一个根结点
- 根结点只有左子树
- 根结点只有右子树
- 根结点既有左子树又有右子树
特殊二叉树:
- 斜树
所有的结点都只有左子树的二叉树叫左斜树,还有右斜树。每层只有一个节点,斜树其实和线性表结构一样。所以线性表也可以理解为树的一种特殊的表现形式。
- 满二叉树
深度为k的满二叉树一定有个结点
- 完全二叉树
对一棵具有n个节点的二叉树按层序编号,如果编号为i的结点与同样深度的满二叉树中的编号为i的结点在二叉树中的位置完全相同,则这棵二叉树称为完全二叉树。
完全二叉树的叶子结点只存在于底部两层且集中在右部连续位置。
满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。
二叉树的性质:
- 在二叉树的第i层上最多有
个结点
- 深度为k的二叉树最多有
个结点,也就是满二叉树
- 对任何一棵二叉树T,如果叶子结点数为n0,度为2的结点数为n2,则n0=n2+1,叶子结点数比度为2的结点数多1
- 具有n个结点的完全二叉树的深度为
(
向下取整)
二叉树的存储结构
可以用顺序存储,但是可能会浪费大量的空间,所以顺序存储只适合完全二叉树。
链式存储更适合二叉树,二叉树每个结点最多有两个孩子,所以为它设计一个数据域和两个指针域。
data是数据域,两个child分别存左孩子和右孩子。
遍历二叉树
前序遍历
根->左->右
ABDGHCEIF
中序遍历
左->根->右
GDHBAEICF
后序遍历
左->右->根
GHDBIEFCA
前、中、后都是以访问根节点的顺序为基准。
- 已知前序遍历序列和中序遍历序列,可以唯一确定一棵二叉树。
- 已知后序遍历序列和中序遍历序列,可以唯一确定一棵二叉树。
- 但是已知前序遍历序列和后序遍历序列,是不能确定一棵二叉树的。
层序遍历
从上到下逐层遍历,再同一层当中从左到右