5 树和二叉树

树形结构与线性结构的不同就是,线性结构的前驱和后继是一对一的,树状结构属于非线性结构,有多个后继。前驱与后继是一对n

5.1 树和二叉树的定义

5.1.1 树的定义

  • 树是个n个结点的有限集
    • 若n=0,称为空树
    • 若n>0,则他满足如下两个条件:
      1. 有且仅有一个特定的称为的结点
      2. 其余结点可分为吗(m>=0)个互不相交的有限集T1,T2,T3。。

5.1.2 树的基本术语

  • 根结点:非空树中无前驱结点的结点。
  • 结点的:结点拥有的子树数。
  • 树的度:树内各结点的度的最大值。
  • 结点的子树的根称为该结点的孩子,该结点称为该孩子的双亲,还有结点的祖先,结点的子孙就不展开描述了。
  • 有序树:树中结点的各子树从左至右有次序(最左边的为第一个孩子)。
  • 无序树:树中结点的各子树无次序。
  • 森林:是m棵互不相交的树的集合
    • 把根结点删除树就变成了森林
    • 一棵树可以看成是一个特殊的森林,树一定是森林,森林不一定是树
    • 给森林中各子树加上一个双亲节点,森林就变成了树

5.1.3 二叉树的定义

二叉树的结构最简单,规律性最强,可以证明所有树都能转化为唯一对应的二叉树,不失一般性。

  • 二叉树:是n个结点的有限集,他或者是空集或者是由一个根结点及两棵互不相交的分别称作这个根的左子树右子树的二叉树组成

    • 特点:每个节点最多两个孩子

    • 子树有左右之分(即使只有一棵子树也进行区分),次序不能颠倒

    • 二叉树可以是空集合,根可以有空的左子树或空的右子树。

    • 具有三个结点的树可能有几种形态?

5.2 案例引入

5.2.1 数据压缩问题

将数据文件转换成由0、1组成的二进制串,称之为编码

具体的方法到哈夫曼树和哈弗曼编码那里学习,这里暂且按下不表

5.2.2 利用二叉树求解表达式的值

  • 以二叉树表示表达式的递归定义如下:
    1. 若表达式为数或简单变量,则相应二叉树中仅有一个根结点,其数据域存放该表达式信息;
    2. 若表达式为 “ 第一操作数 运算符 第二操作数” 的形式, 则相应的二叉树中以左子树表示第一操作数右子树表示第二操作数,根结点存放运算符,其中错作数本身又为表达式。

具体实现,我们会在[5.8 案例分析与实现](####5.8 案例分析与实现)进行讲解

5.3 树和二叉树的抽象数据类型定义

5.4 二叉树的性质和存储结构

  1. 在二叉树的第i层上之多有$\large 2^{i-1}$个结点

  2. 深度为k的二叉树至多有$\large 2^k-1$个结点

  3. 对任何一棵二叉树T,如果其叶子树为$\large n_0$,度为2的结点数为$\large n_2$,则$\large n_0=n_2+1$

    • 总边数$\large B=n-1 = B=n_22+n_11$
    • 总结点数为$\large n=n_22+n_11+1$ 又 $n=n_2+n_1+n_0$
    • 推导出$\large n_0=n_2+1$
  4. 具有n个结点的完全二叉树的深度为[log_2n](向下取整)+1

    性质4表明了完全二叉树结点数n与完全二叉树深度k之间的关系

  5. 如果对一棵有 n个结点的完全二叉树,其结点按层序编号(从第 1 层到第[log2n]+ 1 层, 每层从左到右), 则对任一结点(n=>i>=1), 有如果i=1,无双亲,如果i>1.则其双亲是结点[$\large i/2$]。

    1. 性质5表明了完全二叉树中双亲结点编号与孩子结点编号之间的关系
  • 两种特殊形式的二叉树
    • 满二叉树:一颗深度为k且有$\large 2^k-1$个结点的二叉树称为满二叉树
    • 特点:
      • 每一层上的结点数
      • 编号从上到下,从左到右
    • 完全二叉树:深度为K的, 有n个结点的二叉树, 当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时, 称之为完全二叉树
      • 在满二叉树中,从最后一个结点开始连续去掉任意个结点,都是一棵完全二叉树
      • 叶子只能分布在最大的两层上
      • 对任意一结点,如果其右子树的最大层次为i,则其左子树的最大层次必为i或i-1

5.5 遍历二叉树和线索二叉树

5.5.1 遍历二叉树
  • 遍历的定义——顺着某一条搜索路径巡访二叉树中的结点,使得每个结点均被访问一次,而且仅被访问一次

    • “访问”可以看做对结点作各种处理
  • 遍历的目的——得到树中所有结点的一个线性排列

  • 遍历的用途——它是树结构插入、删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和核心

  • 遍历的算法

    • DLR——先(根)序遍历

    • LDR——中(根)序遍历 【从最左边 开始左根右】,可以吧空序都先画出来,然后再开始遍历

    • LRD——后(根)序遍历

    • 例题——已知中序序列和后续序列求二叉树

    • 前后确定根,中序辨左右 重点