二叉树的遍历

一、二叉树

  树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构。二叉树是每个节点最多有两个子树的有序树。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆或是二叉排序树。二叉树的每个结点至多只有二棵子树(不存在出度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。

  逻辑上二叉树有以下五种基本形态

  • 空二叉树——(a);
  • 只有一个根结点的二叉树——(b);
  • 只有左子树——(c);
  • 只有右子树——(d);
  • 完全二叉树——(e)

  注意:尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形。

二、重要概念

  • 完全二叉树——若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。
  • 满二叉树——除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。
  • 深度——二叉树的层数,就是深度。

三、二叉树的遍历

  遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。

  二叉树有三种遍历方式:先序遍历、中序遍历和后序遍历。

  1、先序遍历

    首先访问根,再先序遍历左(左)子树,最后先序遍历右(右)子树。

    a、先访问A,然后访问A的左子节点B。

    b、B有左子节点D,所以再访问D,D无子节点所以返回到B点。B无右子节点,返回到A。

    c、A有右节点C,访问C。

    d、C有左子节点E,访问E,E无子节点,返回到C。

    e、C有右子节点F,访问F,F无子节点,停止。对上图的遍历结果如下:

    A-B-D-C-E-F

  2、中序遍历

    首先先序遍历左(左)子树,再访问根,最后先序遍历右(右)子树。

    a、先遍历A的左子树B,发现B有左子树,故不访问B,先访问B的左子树D。

    b、D无子节点,退回到B节点,访问B节点。

    c、B节点无右节点,退回到A节点,访问A节点。

    d、开始遍历A的右子树C,C有左节点E,访问E节点。

    e、E无子节点,退回到C节点,访问C。

    f、C有右节点F,访问F,F没有子节点,访问停止对上图的遍历结果如下:

     D-B-A-E-A-F

  3、后序遍历

    首先先序遍历右(右)子树,再访问根,最后先序遍历左(左)子树。

    a、先遍历A的左子树C,发现B有右子树,故不访问C,先访问B的左子树F。

    b、F无子节点,退回到C节点,访问C节点左子树E。

    c、E子节点,退回到C节点,访问C节点。

    d、开始遍历A的左子树,B无右节点,但有左节点D,访问D节点。

    e、退回到B访问B节点。退回到A访问A节点,访问停止对上图的遍历结果如下:

     F-E-C-D-B-A

原文地址:https://www.cnblogs.com/always-online/p/3576744.html