二叉树

一、定义

二叉树是 n 个节点的有限集合,该集合或者为空集(空二叉树),或者由一个根节点和两棵互不相交的、分被称为根节点的左子树和右子树组成。下图为一棵普通的二叉树:

二、二叉树的特点

由二叉树定义以及图示分析得出二叉树有以下特点:

  1. 每个节点最多有两棵子树,所以二叉树中不存在度大于2的节点。
  2. 左子树和右子树是有顺序的,次序不能任意颠倒。
  3. 即使树中某节点只有一棵树,也要区分它是左子树还是右子树。

三、二叉树的性质

  1. 在二叉树的第 i 层上最多有 2^{k-1}个节点。( i >= 1 )
  2. 二叉树中如果深度为 k ,那么最多有 2^{k} -1 个节点。( k >= 1)
  3. n_{0} = n_{2} + 1 n_{0}表示度数为0的节点数,n_{2}表示度数为2的节点数。
  4. 在完全二叉树中,具有n个节点的完全二叉树的深度为log_{2}^{n} +1,其中log_{2}^{n}是向下取整。
  5. 若对n个节点的完全二叉树从上到下且从左到右进行1 至 n 的编号,则对完全二叉树中任意一个编号为i的节点有如下特征:
  1. 若 i=1 ,则该节点是二叉树的根,无双亲。否则,编号为 i/2 的节点为其双亲节点;
  2. 若 2i>n,则该节点无左孩子,否则,编号为 2i 的节点为其左孩子节点;
  3. 若 2i+1>n,则该节点无右孩子节点,否则,编号为 2i+1 的节点为其右孩子节点;

四、斜树

所有的节点都只有左节点的二叉树为左斜树;所有的节点都只有右节点的二叉树为右斜树。

五、满二叉树

满二叉树中,如果所有的分枝节点都存在左子树和右子树,并且所有叶子都在同一层,这样的二叉树称为满二叉树。其特点为:

  1. 叶子只能出现在最下一层,出现在其他层就不可能达成平衡。
  2. 非叶子节点的度一定为2.
  3. 在同样深度的二叉树中,满二叉树的节点个数最多,叶子数最多。

                              

六、完全二叉树

对一棵有 n 个节点的二叉树按层编号,如果编号为 i ( 1<=i<=n )的节点与同样深度的满二叉树中的编号为 i 的节点(非叶子)在二叉树中的位置完全相同,则这棵树称为完全二叉树。

                                           

完全二叉树的特点为:

  1. 叶子节点只能出现在最下层和次下层
  2. 最下层的叶子节点集中在数的左部
  3. 次下层若存在叶子节点,一定是在右部连续位置。
  4. 如果节点度为1,则该节点只有左子树,即没有右子树。
  5. 同样节点数的二叉树,完全二叉树的深度最小。

注:满二叉树一定是完全二叉树,但反过来不一定成立。对于这两个数最好的记忆方法就是除叶子节点外,其节点都是从上到下,从左到右连续排列。

七、二叉树的存储

1、顺序存储:就是使用一维数组存储二叉树中的节点,并且节点的存储位置就是数组的下标。

                                                

上图所示为一棵完全二叉树,采用顺序存储方式:

                                

由上图可知,当一棵二叉树为完全二叉树时,节点刚好填满数组。如果是一棵非完全二叉树,采用这用存储方式又会是怎样的呢?下图为一棵非完全二叉树:

                                   

浅色节点( D H I ) 表示不存在的节点,用二叉树的顺序存储结构如下图

                                

由上图可以看出,如果一棵非完全二叉树仍采用顺序存储的话,就会造成一定的浪费。故此可采用另一种存储方式。

2、二叉链表:二叉树的每个节点最多有两个孩子,因此,可以将节点数据结构定义为一个数据和两个指针域。表示方式如下图所示:

                                                                            

二叉树可以采用如下图表示(一种链表结构存储二叉树,称为二叉链表):

                      

八、二叉树的遍历

二叉树的遍历是指从二叉树的根节点出发,按照某种次序依次访问二叉树中的所有节点,使得每个节点被访问一次,且仅被访问一次。二叉树的访问次序可以分为四种:前序遍历、中序遍历、后序遍历、层序遍历。

1、前序遍历:就是从二叉树的根节点出发,当第一次到达节点时就输出节点数据,按照从左向右的方向访问。

                                                  

对上图的遍历步骤为:

先从根节点开始,第一次到达节点A,输出A;

查看是否有左子节点,有,继续向左访问,第一次到达B,输出B;

相同的规则,输出 D  H ;

此时查看H 是否有左子节点,发现没有,返回D 节点(第二次到达不输出),则查看D是否有右子节点,有 输出I ,返回 D 节点(第三次到达不输出);

此时 D已经输出完毕 ,回到 D 的父节点 B ,查看B节点是否有右子节点并输出E

经过次顺序 依次输出得是:ABDHIEJCFG

有上面的步骤,我们可以看出,整个遍历的过程每一个节点都经过三次,前序遍历就是当第一次到达该节点时输出该值。

那么同样的道理,中序遍历为第二次到达节点时输出该值,输出结果为:HDIBJEAFCG;后序遍历为第三次到达节点时输出值,输出的结果为:HIDJEBFGCA

层序遍历则是按照数的层次自上而下的遍历二叉树,七输出结果为:ABCDEFGHIJ

二叉树到此结束,谨以此文回顾二叉树的基本结构及用法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章