二叉树的定义以及遍历

二叉树的定义以及遍历

      在学习过程中带着问题去思考,这样往往会达到事半功倍的效果。现在有这样一个问题:二叉树的前序遍历为EFHIGJK,中序遍历为HFIEJKG,按照后序遍历和层序遍历的结果是多少?

      为了解决这个问题,我们先看下什么是二叉树以及二叉树是如何遍历的?

     一、什么是二叉树

     1. 定义

     简单理解下:

     1)本身是有序树;

     2)树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2

     2. 二叉树的类型

          2.1 满二叉树

          如果二叉树中除了叶子结点,每个结点的度都为 2,则此二叉树称为满二叉树。

            

         2.2 完全二叉树

     如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。

               

      2.3  非完全二叉树

      如下图:由于最后一层的节点没有按照从左向右分布,因此只能算作是普通的二叉树。

                    

    二.   二叉树的遍历

     1.  几个相关概念

    二叉树的遍历涉及到两个关键点:访问和次序

    :二叉树中,节点的度指的是节点拥有的子树的数目。而整棵树的度指的是树中结点的最大的度。

    根节点:二叉树只有一个根节点,树最顶端的节点就是根节点

    分支节点:也称为非终端节点,度不为零的节点称为非终端节点

    叶子节点:也称为终端节点,没有子树的节点或者度为零的节点

    2.  二叉树的遍历有什么特殊之处?

    在计算机程序中,遍历本身是一个线性操作。所以遍历同样具有线性结构的数组或链表,是一件轻而易举的事情。

    反观二叉树,是典型的非线性数据结构,遍历时需要把非线性关联的节点转化成一个线性的序列,以不同的方式来遍历,遍历出的序列顺序也不同。         

    3.  二叉树的遍历方式

   顺序是:根左右(根在最前面),考察到一个分支节点,即刻输出该节点的值,并继续遍历其左右子树

   说明:每一层都要按照分支节点在前面位置来进行遍历

    1)中序遍历
    顺序是: 左根右(根在中间),考察到一个分支节点,将其暂存,遍历完左子树后,再输出该节点的值,然后遍历右子树

    说明:按照分支节点在中间位置来进行遍历

    2)后序遍历

    顺序是: 左右根(根在最后面),考察到一个分支节点,将其暂存,遍历完左右子树后,再输出该节点的值。

   说明:按照分支节点在后面位置来进行遍历

    3)层序遍历
   这种遍历方式比较简单:从上往下,从左到右

   说明:上面几种遍历方式中,这个根指的是每一层遍历时的分支节点,当然根节点只有一个,根据先序、中序、后序来放置在最前面、中间、最后面

    现在我们再来看下:

  • 由前序遍历结果EFHIGJK,可以得出 是根节点
  • 由中序遍历结果HFIEJKG,可以得出HFI是左子树的节点,JKG是右子树的节点
  • 我们再来看前序遍历结果EFHIGJK,由第2点的分析,将其进行分割为 E,FHI,GJK
  • 由前序遍历的特点是根左右,那么可以得出 G 是第二层的中间节点
  • 再回到中序遍历结果:HFIEJKG

    分析左子树

    由于HFI是一个整体,F是中间节点,可以得出 是F下一层的左边子节点,I 是F下一层的右边子节点。

    如下图:

              

 

     6) 分析右子树:

    由于前面已经推导出 G 是中间节点,由中序遍历结果:HFIEJKG,可以推导出JK构成了G的左子树。

    再下沉一级,来看前序遍历中的结果EFHIGJK。将JK看做一个整体,那么J是中间节点,再回到中序遍历结果HFIEJKG来判断范围,K在J的右侧。

    可以推导出如下图:

           

 

      推导完毕,现在我们可以得出

      后序遍历的结果为: HIFKJGE

      层序遍历的结果为: EFGHIJK

       三、总结

     因为二叉树的遍历首先是根据根节点的位置遍历的,因此推导过程中主要注意这两点:

     1.  首要步骤是通过前序/后序遍历结果推导出根节点

     2.  再通过中序遍历划分节点范围,然后再根据前序/后序遍历结果去推导其他节点的位置。如果还有下一层级就继续按照刚才逻辑推导。

posted @   欢乐豆123  阅读(371)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示