zoukankan      html  css  js  c++  java
  • 二叉树遍历方法

     

    前序遍历

     

    具体过程:

    1. 先访问根节点
    2. 再序遍历左子树
    3. 最后序遍历右子树

    中序遍历

    具体过程:

    1. 先中序遍历左子树
    2. 再访问根节点
    3. 最后中序遍历右子树

    后序遍历

    mark

    递归方式实现后序遍历

    1. 先后序遍历左子树
    2. 再后序遍历右子树
    3. 最后访问根节点
    层次遍历

     二叉树先序遍历的实现思想是:

    1. 访问根节点;
    2. 访问当前节点的左子树;
    3. 若当前节点无左子树,则访问当前节点的右子树;

    图 1 二叉树
     

    以图  1 为例,采用先序遍历的思想遍历该二叉树的过程为:

    1. 访问该二叉树的根节点,找到 1;
    2. 访问节点 1 的左子树,找到节点 2;
    3. 访问节点 2 的左子树,找到节点 4;
    4. 由于访问节点 4 左子树失败,且也没有右子树,因此以节点 4 为根节点的子树遍历完成。但节点 2 还没有遍历其右子树,因此现在开始遍历,即访问节点 5;
    5. 由于节点 5 无左右子树,因此节点 5 遍历完成,并且由此以节点 2 为根节点的子树也遍历完成。现在回到节点 1 ,并开始遍历该节点的右子树,即访问节点 3;
    6. 访问节点 3 左子树,找到节点 6;
    7. 由于节点 6 无左右子树,因此节点 6 遍历完成,回到节点 3 并遍历其右子树,找到节点 7;
    8. 节点 7 无左右子树,因此以节点 3 为根节点的子树遍历完成,同时回归节点 1。由于节点 1 的左右子树全部遍历完成,因此整个二叉树遍历完成;

    因此,图 1 中二叉树采用先序遍历得到的序列为:

    1 2 4 5 3 6 7

    二叉树中序遍历的实现思想是:

    1. 访问当前节点的左子树;
    2. 访问根节点;
    3. 访问当前节点的右子树;

    图 1 二叉树
     

    以图  1 为例,采用中序遍历的思想遍历该二叉树的过程为:

    1. 访问该二叉树的根节点,找到 1;
    2. 遍历节点 1 的左子树,找到节点 2;
    3. 遍历节点 2 的左子树,找到节点 4;
    4. 由于节点 4 无左孩子,因此找到节点 4,并遍历节点 4 的右子树;
    5. 由于节点 4 无右子树,因此节点 2 的左子树遍历完成,访问节点 2;
    6. 遍历节点 2 的右子树,找到节点 5;
    7. 由于节点 5 无左子树,因此访问节点 5 ,又因为节点 5 没有右子树,因此节点 1 的左子树遍历完成,访问节点 1 ,并遍历节点 1 的右子树,找到节点 3;
    8. 遍历节点 3 的左子树,找到节点 6;
    9. 由于节点 6 无左子树,因此访问节点 6,又因为该节点无右子树,因此节点 3 的左子树遍历完成,开始访问节点 3 ,并遍历节点 3 的右子树,找到节点 7;
    10. 由于节点 7 无左子树,因此访问节点 7,又因为该节点无右子树,因此节点 1 的右子树遍历完成,即整棵树遍历完成;

    因此,图 1 中二叉树采用中序遍历得到的序列为:

    4 2 5 1 6 3 7

    二叉树后序遍历的实现思想是:从根节点出发,依次遍历各节点的左右子树,直到当前节点左右子树遍历完成后,才访问该节点元素。



    图 1 二叉树
     

    如图 1 中,对此二叉树进行后序遍历的操作过程为:

    • 从根节点 1 开始,遍历该节点的左子树(以节点 2 为根节点);
    • 遍历节点 2 的左子树(以节点 4 为根节点);
    • 由于节点 4 既没有左子树,也没有右子树,此时访问该节点中的元素 4,并回退到节点 2 ,遍历节点 2 的右子树(以 5 为根节点);
    • 由于节点 5 无左右子树,因此可以访问节点 5 ,并且此时节点 2 的左右子树也遍历完成,因此也可以访问节点 2;
    • 此时回退到节点 1 ,开始遍历节点 1 的右子树(以节点 3 为根节点);
    • 遍历节点 3 的左子树(以节点 6 为根节点);
    • 由于节点 6 无左右子树,因此访问节点 6,并回退到节点 3,开始遍历节点 3 的右子树(以节点 7 为根节点);
    • 由于节点 7 无左右子树,因此访问节点 7,并且节点 3 的左右子树也遍历完成,可以访问节点 3;节点 1 的左右子树也遍历完成,可以访问节点 1;
    • 到此,整棵树的遍历结束。

    由此,对图 1 中二叉树进行后序遍历的结果为:

    4 5 2 6 7 3 1

     满二叉树:二叉树中每个内部结点都有存在左子树和右子树(或者说满二叉树所有的叶结点都有同样的深度)

    满二叉树一定是完全二叉树,但完全二叉树不一定是满二叉树
    (满二叉树的严格的定义是:一颗深度为h且有2h-1个结点的二叉树)

     完全二叉树:
    第一种解释:如果一颗二叉树除最右边位置上有一个或几个叶结点缺少外,其他是丰满的那么这样的二叉树就是完全二叉树(这句话不太好理解),看下面第二种解释
    第二种解释:除第h层外,其他各层(1到h-1)的结点数都达到最大个数,第h层从右向左连续缺若干结点,则这个二叉树就是完全二叉树
    也就是说如果一个结点有右子结点,那么它一定也有左子结点
    第三种解释:除最后一层外,每一层上的节点数均达到最大值,在最后一层上只缺少右边的若干结点
    完全二叉树的形状类似于下图
    为了方便理解请看下图(个人理解:完全二叉树就是从上往下填结点,从左往右填,填满了一层再填下一层)

    结点的度和层次

    对于一个结点,拥有的子树数(结点有多少分支)称为结点的度(Degree)。例如,图 1(A)中,根结点 A 下分出了 3 个子树,所以,结点 A 的度为 3。

    一棵树的度是树内各结点的度的最大值。图 1(A)表示的树中,各个结点的度的最大值为 3,所以,整棵树的度的值是 3。

    结点的层次:从一棵树的树根开始,树根所在层为第一层,根的孩子结点所在的层为第二层,依次类推。对于图 1(A)来说,A 结点在第一层,B、C、D 为第二层,E、F、G、H、I、J 在第三层,K、L、M 在第四层。

    一棵树的深度(高度)是树中结点所在的最大的层次。图 1(A)树的深度为 4。

    树的表示方法

    除了图 1(A)表示树的方法外,还有其他表示方法:

     

              (A)                                         (B)
    图2 树的表示形式
     

    图 2(A)是以嵌套的集合的形式表示的(集合之间绝不能相交,即图中任意两个圈不能相交)。

    图 2(B)使用的是凹入表示法(了解即可),表示方式是:最长条为根结点,相同长度的表示在同一层次。例如 B、C、D 长度相同,都为 A 的子结点,E 和 F 长度相同,为 B 的子结点,K 和 L 长度相同,为 E 的子结点,依此类推。

    最常用的表示方法是使用广义表的方式。图 1(A)用广义表表示为:

    (A , ( B ( E ( K , L ) , F ) , C ( G ) , D ( H ( M ) , I , J ) ) )

    二叉树的性质

    1. 二叉树中,第 i 层最多有 2i-1 个结点。
    2. 如果二叉树的深度为 K,那么此二叉树最多有 2K-1 个结点。
    3. 二叉树中,终端结点数(叶子结点数)为 n0,度为 2 的结点数为 n2,则 n0=n2+1

    参考:【图解数据结构】 二叉树遍历

  • 相关阅读:
    jquery插件-自定义select
    本地存储组件--兼容IE低版本
    jquery插件-省市联动
    nodejs学习笔记之包、模块实现
    nodejs学习笔记之安装、入门
    javascript的事件处理
    JS中简单的this学习
    你了解JS执行过程吗?
    halcon程序输出成c++程序
    poj3040
  • 原文地址:https://www.cnblogs.com/zouhong/p/15343653.html
Copyright © 2011-2022 走看看