`

二叉树遍历 推倒总结

 
阅读更多

第一次总结,个人浅见,望大牛们轻削,怕疼,呵呵~~~

 

1.已知前序遍历和中序遍历序列,可以唯一确定一棵二叉树。

2.已知后序遍历和中序遍历序列,可以唯一确定一棵二叉树。

3.已知后续遍历和前序遍历序列,不能唯一确定一棵二叉树。

综上:要想唯一确定一个二叉树,必须要有中序遍历序列。

 

遍历规则:

1、先序或者前序遍历规则:根左右
2、中序遍历规则:左根右
3、后序遍历规则:左右根

 

例子1:前序:abcdef,中序:cbaedf,后序=?

 

      根据前序规则:根左右,根是第一个被遍历的,那么这棵树的根就是a,那么就可以将中序遍历分隔出来左子树和右子树了

      左子树:b、c 右子树:d、e、f

 

      如下:
          前序 a|bc|def
          中序 cb|a|edf

 

      左子树:

 

      左子树前序遍历顺序为bc,首先遍历左子树的"根",则b为左子树的根节点
      中序遍历顺序为cb,遍历顺序为左根右,则可知c为b的左叶子节点

 

      右子树:


      前序遍历规则:根左右,右子树的"根"为d,则e、f是d的子节点
      中序遍历规则:左根右,e是d的左叶子节点,f是d的右叶子节点
     
      此时就把这棵树的左子树和右子树确定了下来,如下:
                    a
                   / \
                  b   d
                 /     / \
                c     e   f
      再根据后序遍历规则:左右根,可知后序遍历结果:cbefda

 

 

 

      详解:先从左子树遍历,先找到左叶子节点c,然后左右根规则,b节点没有右叶子节点,遍历"根",则此时为cb,左子树遍历完毕,根据左右根规则,整棵树的根是最后遍历的,先遍历完左子树,然后遍历右子树,最后遍历整棵树的根遍历右子树,根据左右根规则,找到左叶子节点e,然后遍历f,再遍历d,则此时右子树遍历为efd,右子树遍历完毕,最后遍历整棵树的根a。完整的后序遍历顺序就是:cbefda
     
      小结:

      (1)根据前(先)序判断根节点,从中序分隔左子树和右子树
      (2)然后根据先序,中序遍历规则结合,分别处理左右子树,将树的节点顺序确定下来
      (3)最终确定整棵树,画出来,最后再根据后序遍历规则进行遍历即可。

 

例子2:中序:abcdefg,后序:bdcafge,前(先)序=?

 

       根据后序遍历规则:左右根,可知,根是最后遍历的节点,那么e就是整棵树的根节点。然后根据中序遍历规则:左根右,e又是根节点,那么必定有左子树(如果没有左子树a就是根节点),可知a一定在左子树中,那么可以将中序和后序结果分出左子树和右子树来


       左子树:a、b、c、d  右子树:e、f、g
      
       如下:
          中序:abcd|efg
          后序:bdca|fge
       
       右子树:

 

 

       右子树节点少,先处理右子树,已知e为树的根节点,
       中序遍历规则为:左根右,有以下情况:
       (1)f若是右子树的左叶子节点,g则是右子树根节点;
       (2)f若是右子树的根节点,g则是右子树的右叶子节点
       后序遍历规则:左右根,根据中序遍历情况(1),f右子树的左叶子节点,g右子树根节点的规则,可以得出fg的遍历结果;

       根据中序遍历情况(2),那么首先遍历的节点应该是g,之后是f,和正确结果不符,那么第一种情况就是我们想要的结果。
       此时右子树节点顺序确定完毕,结果为:f是右子树的左叶子节点,g是右子树根节点
      

       左子树:
      
       看左子树后序遍历结果:bdca,根据左右根规则可知,a是左子树的根节点,那么就是确定b、c、d在左子树中的顺序了
       看左子树中序遍历结果abcd,a是左子树根节点,并且a节点没有左子节点(如果有,那么中序遍历就从a的左子节点开始,不符合题目中的中序遍历结果),所以bcd组成了a节点的右子树,此处定义a节点的右子树为A子树。


       情况如下:
       (1)b为A子树的左叶子节点,则c为A子树根节点,d为A子树的右叶子节点
       (2)b为A子树的根节点,则c为A子树的右子节点,d为c的右叶子节点


       有点绕啊,不好意思~~~~这时候其实就应该在纸上画出图形了,直观和容易比对出现的情况

 

 

       后序遍历结果:bdc(a已知为左子树根节点,暂不考虑)
       规则:左右根
       根据中序遍历情况(1),b为左叶子节点,d为右叶子节点,c为"根"节点,可以得出bdc的结果
       根据中序遍历情况(2),后序遍历结果为:dcb, 和题目中正确后序遍历结果不一致,那么第一种情况就是我们要的结果,此时左子树可以确定节点顺序,结果:定义a节点的右子树为A子树。b为A子树的左叶子节点,c为A子树根节点,d为A子树的右叶子节点
      

       此时就把这棵树的左子树和右子树确定了下来,如下:
                            e
                         /      \
                        a        g
                         \      /
                          c    f                       
                         / \
                        b  d


       再根据先序遍历顺序:根左右,可知先序遍历顺序:eacbdgf

 

       详解:先从整棵树的根开始遍历,e,然后遍历左子树,左子树根为a,左子树没有左子节点,开始遍历右子节点,"根"为c,遍历左子节点b,右子节点d,此时左子树遍历完毕,结果为eacbd遍历右子树,右子树根节点为g,然后遍历左子节点为f,此时右子树遍历完毕,结果:gf
       整棵树先序遍历完毕,结果:eacbdgf

 

       小结:
       (1)根据后序遍历结果找出整棵树的根节点
       (2)根据中序遍历的起始节点将后序遍历和中序遍历结果分隔成左子树和右子树
       (3)先处理节点较少的子树,再处理节点较多的子树
       (4)根据后序遍历结果区分出来的子树序列节点的最后一个节点,确定为该子树的根节点
       (5)然后对剩下的节点根据中序遍历顺序假设各种情况,用后序遍历规则对这些情况进行套用,找出符合后序遍历结果的那种情况。
       如果分隔出来的左右子树节点多而复杂可以继续套用(4)、(5),进行区分处理
 

以上是小弟的个人浅见,可能大家还有更多更好更简便的方法,希望大家能够互相交流讨论。

题目来源:http://www.cnblogs.com/strider/articles/2104219.html

0
0
分享到:
评论

相关推荐

    【C语言二叉树遍历实例】C语言二叉树遍历实例

    二叉树的遍历C语言二叉树遍历实例C语言二叉树遍历实例C语言二叉树遍历实例C语言二叉树遍历实例C语言二叉树遍历实例C语言二叉树遍历实例C语言二叉树遍历实例C语言二叉树遍历实例C语言二叉树遍历实例C语言二叉树遍历...

    二叉树遍历的特点(数据结构)C语言描述

    ### 二叉树遍历的特点(数据结构) 在计算机科学领域,数据结构是研究的核心之一。其中,二叉树作为一种重要的非线性数据结构,在实际应用中极为广泛,包括搜索算法、排序算法等方面都有其身影。本文将详细介绍...

    二叉树遍历问题-前序, 中序, 后序

    二叉树遍历问题 二叉树遍历问题-前序, 中序, 后序二叉树遍历问题-前序, 中序, 后序二叉树遍历问题-前序, 中序, 后序二叉树遍历问题-前序, 中序, 后序二叉树遍历问题-前序, 中序, 后序二叉树遍历问题-前序...

    易语言二叉树遍历

    二叉树遍历是理解数据结构和算法的基础,它包括前序遍历、中序遍历和后序遍历三种主要方法。 1. **二叉树的基本概念**: - 二叉树是一种特殊的树结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。 -...

    二叉树遍历 二叉树遍历

    二叉树遍历 二叉树遍历

    二叉树的遍历实验报告.pdf

    总结,二叉树遍历是理解和操作二叉树的关键步骤,通过递归实现的先序、中序、后序遍历提供了灵活的访问和处理节点的方法。掌握这些遍历技巧对于解决复杂问题至关重要,特别是在实际编程应用中,如搜索算法、文件系统...

    数据结构 二叉树遍历程序

    二叉树遍历是理解二叉树操作的关键部分,主要包括先序遍历、中序遍历和后序遍历三种方式。 1. 先序遍历(Preorder Traversal): 先序遍历的顺序是根节点 -> 左子树 -> 右子树。在C语言实现中,一般采用递归的方法...

    二叉树遍历算法的应用

    总结来说,二叉树遍历算法在实际问题中具有广泛的实用性,不仅可以用于数据结构的分析,还能解决如统计信息和计算深度等实际问题。通过理解和掌握这些算法,开发者可以更有效地处理涉及二叉树的各种挑战。

    数据结构树和二叉树遍历二叉树和线索二叉树PPT学习教案.pptx

    "数据结构树和二叉树遍历二叉树和线索二叉树PPT学习教案.pptx" 本资源主要讲述了数据结构树和二叉树遍历的相关知识点,包括二叉树的基本概念、二叉树遍历的六种方案、先序、中序、后序遍历算法的实现、线索二叉树的...

    堆栈实现二叉树遍历数据结构C语言

    从给定的文件信息来看,该文件主要围绕“堆栈实现二叉树遍历数据结构”的主题,通过C语言编程来实现。以下是基于标题、描述、标签和部分内容的知识点总结和详细说明: ### 1. 数据结构基础 数据结构是计算机科学的...

    二叉树遍历实验报告

    ### 二叉树遍历实验报告知识点概览 #### 一、实验背景及目标 **实验背景:** 本次实验属于《数据结构》课程的一部分,旨在通过实际编程加深学生对二叉树这一数据结构的理解和应用能力。二叉树作为一种基本且重要的...

    数据结构实验-3二叉树遍历与路径查找(二叉树实验)

    实现功能:建立二叉树存储结构、求二叉树的先序遍历、求二叉树的中序遍历、求二叉树的后序遍历、求二叉树的层次遍历、求根到给定结点的路径。 主控菜单: 1.建立二叉树存储结构 2.求二叉树的先序遍历 3.求二叉树...

    二叉树遍历问题 关于二叉树遍历问题的一些总结

    二叉树遍历是计算机科学中处理树结构数据时常用的一种技术,对于理解和解决与树相关的算法问题至关重要。本文将深入探讨二叉树的三种遍历方法:先序遍历、中序遍历和后序遍历,并提供相关算法模板。 1. **先序遍历*...

    实现先序,中序和后序遍历的二叉树遍历程序

    本程序实现了三种主要的二叉树遍历方法:先序遍历、中序遍历和后序遍历。以下是关于这些遍历方法的详细解释: 1. 先序遍历(Preorder Traversal): - 访问根节点。 - 对左子树进行先序遍历。 - 对右子树进行...

    二叉树遍历问题-二叉树遍历问题

    二叉树遍历是计算机科学中的一个重要概念,主要应用于数据结构和算法领域。二叉树是一种特殊的树形数据结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树遍历是指按照特定顺序访问二叉树的所有...

    数据结构 二叉树遍历

    根据给定的信息,本文将详细解释二叉树的几种遍历方法:先序遍历、中序遍历和后序遍历,并通过示例代码来加深理解。 ### 一、二叉树及其遍历概念 #### 1.1 二叉树定义 二叉树是一种特殊的树形结构,其中每个节点...

    二叉树遍历的算24程序

    java 写的算24程序。用两种二叉树遍历,并规整输出字符串

    二叉树遍历操作.cpp

    二叉树遍历操作.cpp

    数据结构-二叉树遍历

    它的遍历是理解和操作二叉树的基础,这其中包括前序遍历、中序遍历、后序遍历以及层次遍历(也称为广度优先搜索)。 1. 前序遍历:前序遍历的顺序是“根-左-右”,即首先访问根节点,然后递归地访问左子树,最后...

Global site tag (gtag.js) - Google Analytics