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

  首先介绍一下三种遍历顺序的操作方法:

 
1.先序遍历

  (1)访问根结点;

  (2)先序遍历左子树;

  (3)先序遍历右子树。

  2.中序遍历

  (1)中序遍历左子树;

  (2)访问根结点;

  (3)中序遍历右子树。

 
3.后序遍历

  (1)后序遍历左子树;

  (2)后序遍历右子树;

  (3)访问根结点。

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

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

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

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

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

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

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

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

 

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

  另一种情况为已知中序和后序遍历序列求先序遍历序列,我们将分别在后面的博客中介绍。

                     ————————未完,待续。。。————————

  

时间: 2024-12-22 10:21:56

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

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

问题描述 求助,已知二叉树前序终序号求后序的下面这段程序的递归部分的意义,看不懂啊 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,

c语言-大神求教C语言,知道二叉树先序中序遍历序列,求后序遍历序列。

问题描述 大神求教C语言,知道二叉树先序中序遍历序列,求后序遍历序列. #include#include#include using namespace std; typedef struct Btree{ struct Btree *left; struct Btree *right; char data;}Node; void Create_Btree(Node *tree char *pre int pre_low int pre_high char *middle int middle_

c++-算法题。已知两个平行四边形各自的四个点,求这两个平行四边形是否有交集!用代码如何实现?

问题描述 算法题.已知两个平行四边形各自的四个点,求这两个平行四边形是否有交集!用代码如何实现? 算法题.已知两个平行四边形各自的四个点,求这两个平行四边形是否有交集!用代码如何实现? 解决方案 计算角度有点复杂,或许可以考虑判断点在两对平行线之间.判断点位于一对平行线之间(一条线上,一条线下):将点代入一对平行线方程,判断L1(x,y)*L2(x,y)<=0. 解决方案二: 如果两个平行四边形相交,那么一个四边形中必然有一个顶点位于令一个四边形的内部. 而判断一个点P是否在一个平行四边形ABC

元素***不是已知元素,原因可能是网站中存在编译错误

问题描述 我用的母版页,也用了AJAX后,我的所有aspx文件中的控件都出现"元素***不是已知元素,原因可能是网站中存在编译错误",但是编译可以通过这是怎么回事啊,怎么解决这个问题啊?希望高手指点!!!谢谢!!!! 解决方案 解决方案二:貌似vs的问题,楼主什么版本的?有时候重启一下就好了.解决方案三:ajax版本问题.导致在查看设计的页面都会出现错误.安装下ajax安装包解决方案四:没装Ajax的包,能通过编译吗?不是包的问题.估计是VS的bug解决方案五:这个问题在引用第三方的时

判断整数序列是否为二元查找树的后序遍历结果的解决方法_C 语言

题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果.如果是返回true,否则返回false.例如输入5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果.    8    / \  6   10 / \    / \ 5  7 9 11因此返回true.如果输入7.4.6.5,没有哪棵树的后序遍历的结果是这个序列,因此返回false.本题网上已经有用递归单纯判断的解法. 个人解法: 先得到序列对应的中序序列, 然后看中序序列是否从小到大有序, 得出判断. 相比

C#编程中,已知等差数列的首项,尾项和公差,求等差数列的没一项

问题描述 这是我写的代码,语法没错误,但是运行起来总有无法处理的异常usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;namespacedcsl{publicpartialclassForm1:Form{publi

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

前面已经介绍过三种遍历方法的规则,为了大家看着方便,这里我们在重新介绍一遍:   1.先序遍历   (1)访问根结点:   (2)先序遍历左子树:   (3)先序遍历右子树.   2.中序遍历   (1)中序遍历左子树:   (2)访问根结点:   (3)中序遍历右子树.   3.后序遍历   (1)后序遍历左子树:   (2)后序遍历右子树:   (3)访问根结点.   知道了二叉树的三种遍历规则,只要有中序遍历序列和前后任一种遍历序列,我们就可以求出第三种遍历序列,今天我们研究的是已知中序和

二叉树前序、中序、后序遍历相互求法

今天来总结下二叉树前序.中序.后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明. 首先,我们看看前序.中序.后序遍历的特性:  前序遍历:      1.访问根节点      2.前序遍历左子树      3.前序遍历右子树  中序遍历:      1.中序遍历左子树      2.访问根节点      3.中序遍历右子树  后序遍历:      1.后序遍历左子树      2.后序遍历右

C++中的树、二叉树、二叉树遍历、二叉树前序、中序、后序遍历相互求法

本博文来总结下树.二叉树以及二叉树前序.中序.后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明. 1.什么是树?什么是二叉树? 树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合. 二叉树是指结点的度不超过2的有序树. (结点的度:树中的一个结点拥有的子树数目.) 2.二叉树的前序.中序.后序遍历的特性  二叉树前序遍历特性:   (1).访问根节点  (2).前序遍