二叉树

二叉树是n(n>=0)个结点的有限集合,二叉树中的节点最多只能有两个子结点。

二叉树的特点:

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

二叉树具有五种基本形态:

  1. 空二叉树
  2. 只有一个根结点
  3. 根结点只有左子树
  4. 根结点只有右子树
  5. 根结点既有左子树又有右子树

特殊二叉树:

  • 斜树

所有的结点都只有左子树的二叉树叫左斜树,还有右斜树。每层只有一个节点,斜树其实和线性表结构一样。所以线性表也可以理解为树的一种特殊的表现形式。

  • 满二叉树

二叉树

二叉树

深度为k的满二叉树一定有二叉树个结点

  • 完全二叉树

对一棵具有n个节点的二叉树按层序编号,如果编号为i的结点与同样深度的满二叉树中的编号为i的结点在二叉树中的位置完全相同,则这棵二叉树称为完全二叉树。

二叉树

   完全二叉树的叶子结点只存在于底部两层且集中在右部连续位置。

   满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。

二叉树的性质:

  1. 在二叉树的第i层上最多有二叉树个结点
  2. 深度为k的二叉树最多有二叉树个结点,也就是满二叉树
  3. 对任何一棵二叉树T,如果叶子结点数为n0,度为2的结点数为n2,则n0=n2+1,叶子结点数比度为2的结点数多1
  4. 具有n个结点的完全二叉树的深度为二叉树  (二叉树向下取整)
  5.  

二叉树

二叉树的存储结构

    可以用顺序存储,但是可能会浪费大量的空间,所以顺序存储只适合完全二叉树。

    链式存储更适合二叉树,二叉树每个结点最多有两个孩子,所以为它设计一个数据域和两个指针域。

二叉树

    data是数据域,两个child分别存左孩子和右孩子。

二叉树

遍历二叉树

  前序遍历

       ->左->右

       二叉树

    ABDGHCEIF

二叉树

 

    中序遍历

       左->->右

        二叉树

    GDHBAEICF

二叉树

    后序遍历

       左->右->

        二叉树

    GHDBIEFCA

二叉树

前、中、后都是以访问根节点的顺序为基准。

  • 已知前序遍历序列和中序遍历序列,可以唯一确定一棵二叉树。
  • 已知后序遍历序列和中序遍历序列,可以唯一确定一棵二叉树。
  • 但是已知前序遍历序列和后序遍历序列,是不能确定一棵二叉树的。

    层序遍历

       从上到下逐层遍历,再同一层当中从左到右

        二叉树