数据结构之二叉树学习(一)
1 基本概念
1.1 节点(结点)Node
结点是数据结构中的基础,是构成复杂数据结构的基本组成单位。
1.2 树结点
树结点,就是指树结构中的基本结点。
1.3 树
树(Tree)是n(n>=0)个结点组成的有限集合。
1》当n=0时,称为空树。
2》在任何一个非空树中,即,当n>=1时,有且仅有一个特定的,被称为根(Root)的结点。
3》当n>1时,其余结点可以分为m(m>0)个互不相交的有限集:T1,T2,T3,···,Tm,其中每个集合Tm本身又是一棵树,并且称为根的子树。
4》当n>0时,根结点是唯一的,不可能存在多个根结点,数据结构中的树,只能有一个根结点。
5》当m>0时,子树的个数没有限制,但它们一定是互不相交的。
1.4 结点的度
结点拥有多少个子树,就说结点有多少度。
1.5 结点的层次
从根结点开始,根结点为第一层,根结点的子结点为第二层,以此类推。
1.6 树的深度
一棵树的结点中最高的层次数,就是该树的深度。
1.7 结点间的关系
1》子结点
2》父结点
3》兄弟结点
4》叶子结点
2 二叉树
2.1 定义
二叉树,是n(n>=0)个结点的有限集合,该集合
1》或为空集,即空二叉树;
2》或为由一个根结点,和两棵互不相交的的、分别称为根左子树,根的右子树组成。
3》斜树,所有结点都只有左子树的二叉树,称为左斜树;所有结点都只有右子树的二叉树,称为右斜树。
4》满二叉树,在一棵二叉树中,所有分支结点都存在左右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。
5》完全二叉树,对一个具有n个结点的二叉树A,按层编号,如果编号为i(1 <= i <= n)的结点,与同样深度的满二叉树B中的编号为i的结点位置完全相同,那么二叉树A称为完全二叉树。
2.2 特性
2.2.1 二叉树的特性
1》二叉树的每个结点,最多有两个子树,即每个结点的度不大于2;
2》左子树与右子树是有顺序的,次序不可颠倒;
3》即使某个结点只有一个子树,也要区分他是左子树还是右子树。
2.2.2 满二叉树的特性
1》叶子结点只能出现在最下层。(出现在其他层,就不能达成平衡?)
2》非叶子结点的度一定是2。
3》在同样深度的二叉树中,满二叉树的结点最多,叶子结点最多。
2.2.3 完全二叉树的特性
1》叶子结点只能出现在最下层和倒数第二层;
2》最下层的叶子结点都集中在树的左部;
3》倒数第二层若存在叶子结点,则一定是在右边连续;
4》若结点度为1,则该结点只有左子树,没有右子树;
5》同样结点数量的二叉树,完全二叉树的深度最小(满二叉树是完全二叉树的特例?二叉树有哪些?左右二叉树?完全或满二叉树?普通二叉树?);
6》满二叉树一定的完全二叉树,完全二叉树不一定是满二叉树。
3 二叉树的存储结构
3.1 顺序存储结构
二叉树的顺序存储结构,就是使用一维数组,按完全二叉树的顺序,将各节点对号入座,如有空节点,也会占用对应的数组空间。
顺序存储结构一般只适合完全二叉树,非完全二叉树会造成存储空间的浪费。
3.2 二叉链表(*)
由于顺序存储结构不能满足二叉树的需求,那么考虑链式存储。
每个节点最多有两个子节点,最多只有一个父节点。
具体实现:
4 二叉树的遍历
二叉树的遍历是指,从二叉树的根结点出发,按某种次序依次访问二叉树中的所有结点,使二叉树中的每个结点被访问一次,且只能访问一次。
其实质,就是把二叉树进行线性排列的过程。
4.1 前置遍历
根节点在1,左节点在2,右节点在3
4.2 中置遍历
左节点在1,根节点在2,右节点在3
4.3 后置遍历
左节点在1,右节点在2,根节点在3
4.4 层次遍历
从上至下,从左至右