二叉树系列(二):已知中序遍历序列和后序遍历序列,求先序遍历序列

前面已经介绍过三种遍历方法的规则,为了大家看着方便,这里我们在重新介绍一遍:

 
1.先序遍历

  (1)访问根结点;

  (2)先序遍历左子树;

  (3)先序遍历右子树。

  2.中序遍历

  (1)中序遍历左子树;

  (2)访问根结点;

  (3)中序遍历右子树。

 
3.后序遍历

  (1)后序遍历左子树;

  (2)后序遍历右子树;

  (3)访问根结点。

  知道了二叉树的三种遍历规则,只要有中序遍历序列和前后任一种遍历序列,我们就可以求出第三种遍历序列,今天我们研究的是已知中序和后序遍历序列,求先序遍历序列。

  已知该二叉树的中序遍历序列为:D-B-G-E-A-C-F,后序遍历序列为:D-G-E-B-F-C-A。

  接下来我们就可以求出该二叉树的先序遍历序列,具体步骤如下:

  第一步:还是先求root根节点,根据后序遍历规则我们可知root为后序遍历序列的最后一个节点,因此该二叉树的root节点为A。

  第二步:求root的左子树和右子树,这点我们还是从中序遍历序列中找出,位于root节点A左侧的D-B-G-E为root的左子树,位于A右侧的C-F为右子树。

  第三步:求root的左孩子leftchild和右孩子rightchild,leftchild为左子树的根节点,rightchild为右子树的根节点。我们可以找到左子树D-B-E-G在后序遍历序列中的排列顺序为D-G-E-B,由于后序遍历最后访问根节点,所以B为左子树的根节点,即B为root的leftchild;同理root的rightchild为C。

  第四步:我们可以根据上面的步骤找到B的左子树和右子树,以及C的左子树和右子树,然后分别求出左右子树的根节点。以此类推,只要求出根节点及其leftchild和rightchild,剩下的过程都是递归的,最后我们就可以还原整个二叉树。

  根据以上步骤我们求出的二叉树如下图所示:

  

  最后我们直接可以根据先序遍历的遍历规则得出该二叉树的先序遍历序列为:A-B-D-E-G-C-F。

  通过和上一篇博客联系,我们可以看出,不管是知道中序序列和先序序列还是知道中序序列和后序序列求另外一种序列的方法都大同小异,但是从求root的左右子树可以看出,中序序列必须为已知条件。目前以自己的水平还不能根据先序和后序来求出中序,在此不敢妄加断言能或者不能,哪位大神知道结果还希望不吝赐教。

时间: 2024-09-19 20:35:20

二叉树系列(二):已知中序遍历序列和后序遍历序列,求先序遍历序列的相关文章

iOS中CoreData数据管理系列二——CoreData框架中三个重要的类

iOS中CoreData数据管理系列二--CoreData框架中三个重要的类 一.引言     在上一篇博客中,介绍了iOS中使用CoreData框架设计数据模型的相关步骤.CoreData框架中通过相关的类将数据--数据模型--开发者无缝的衔接起来.NSManagedObjectModel对应数据模型,即上篇博客中我们创建的.xcdatamodeld文件:NSPersistentStoreCoordinator相当于数据库与数据模型之间的桥接器,通过NSPersistentStoreCoord

ABP架构学习系列二:ABP中配置的注册和初始化

一.手工搭建平台 1.创建项目 创建MVC5项目,手动引入Abp.Abp.Web.Abp.Web.Mvc.Abp.Web.Api 使用nuget添加Newtonsoft.Json.Castle.Core.Castle.Windsor Install-Package Newtonsoft.Json -Version 8.0.3 Install-Package Castle.Windsor -Version 3.3.0 2.创建WebModule类 在App_Start下创建一个ZmBlogWebM

二叉树系列(一):已知先序遍历序列和中序遍历序列,求后序遍历序列

  首先介绍一下三种遍历顺序的操作方法:   1.先序遍历   (1)访问根结点:   (2)先序遍历左子树:   (3)先序遍历右子树.   2.中序遍历   (1)中序遍历左子树:   (2)访问根结点:   (3)中序遍历右子树.   3.后序遍历   (1)后序遍历左子树:   (2)后序遍历右子树:   (3)访问根结点.   知道了二叉树的三种遍历规则,只要有中序遍历序列和前后任一种遍历序列,我们就可以求出第三种遍历序列,今天我们研究的是已知先序和中序遍历序列,求后序遍历序列.   

[算法系列之三]二叉树中序前序序列(或后序)求解树

[思路] 这种题一般有二种形式,共同点是都已知中序序列.如果没有中序序列,是无法唯一确定一棵树的. <1>已知二叉树的前序序列和中序序列,求解树. 1.确定树的根节点.树根是当前树中所有元素在前序遍历中最先出现的元素. 2.求解树的子树.找出根节点在中序遍历中的位置,根左边的所有元素就是左子树,根右边的所有元素就是右子树.若根节点左边或右边为空,则该方向子树为空:若根节点 边和右边都为空,则根节点已经为叶子节点. 3.递归求解树.将左子树和右子树分别看成一棵二叉树,重复1.2.3步,直到所有的

javascript-easyui中datagrid合并单元格后,再编辑。单元格错位怎么解决?

问题描述 easyui中datagrid合并单元格后,再编辑.单元格错位怎么解决? easyui中datagrid合并单元格后,当开启其他列某一个单元格进入编辑状态时,合并行会出现错位,该怎么解决啊??? 解决方案 EasyUI DataGrid可编辑单元格easyUI合并DataGrid单元格jquery easyUI 中datagrid单元格的合并 解决方案二: easyui中datagrid合并单元格后,再编辑

框架中jsp弹出js后提交表单时执行action时没有跳转回原jsp,

问题描述 框架中jsp弹出js后提交表单时执行action时没有跳转回原jsp,而是在打开了另外一个页面,我想让它跳回原jsp.人事管理中后台,框架右边显示员工所有信息,点上面添加员工,弹出一个子页面,填写信息点提交执行Action但是跳转是打开新的查询所有员工信息页面,应该是关闭该子页面,并且回到原框架父页面.这样跳转才是对,如何解决 解决方案 解决方案二:框架中jsp弹出js后提交表单时执行action时没有跳转回原jsp,解决方案三:怎么可能跳回原页面呢?肯定是跳到result页面啊.你要

c语言-已知二叉树的中序遍历序列与层次遍历序列分别存于数组A[1-n] B[1-n]中,建立二叉树的二叉链表。

问题描述 已知二叉树的中序遍历序列与层次遍历序列分别存于数组A[1-n] B[1-n]中,建立二叉树的二叉链表. 已知二叉树的中序遍历序列与层次遍历序列分别将值存于数组A[1-n].B[1-n]中,请编程建立二叉树的二叉链表. 二叉树结点定义 typedef struct { Elemtype data; BiNode* lchild,rchild; }BiNode,*BiTree; 解决方案 http://www.zybang.com/question/23e04267bb862ea67197

求助,已知二叉树前序终序号求后序的下面这段程序的递归部分的意义,看不懂啊

问题描述 求助,已知二叉树前序终序号求后序的下面这段程序的递归部分的意义,看不懂啊 public class Solution { public TreeNode reConstructBinaryTree(int [] pre,int [] in) { TreeNode root=reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1); return root; } //前序遍历{1,2,4,7,3,5,6,8}和中序遍历序列{4,

已知一棵树的前序序列为ABCDEF,后序序列为CEDFBA,则对该树进行层次遍历得到的序列为?

问题描述 已知一棵树的前序序列为ABCDEF,后序序列为CEDFBA,则对该树进行层次遍历得到的序列为? 遇见已知先序后序这类问题如何解决?感觉没有中序很难0.0求大神~! 解决方案 http://www.docin.com/p-633991719.html abcdfe 解决方案二: 这道题和一般题,有一点不一样,一般来说必须要有中序遍历+前序遍历或者后序遍历,这样才能确定唯一的根和,左右子树的未知, 但是这道题直接给的前后序列.....所以无法确定左右子树,,,,,我也很想知道分析方法..