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

简介: 前面已经介绍过三种遍历方法的规则,为了大家看着方便,这里我们在重新介绍一遍:  1.先序遍历  (1)访问根结点;  (2)先序遍历左子树;  (3)先序遍历右子树。
前面已经介绍过三种遍历方法的规则,为了大家看着方便,这里我们在重新介绍一遍:

  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的左右子树可以看出,中序序列必须为已知条件。目前以自己的水平还不能根据先序和后序来求出中序,在此不敢妄加断言能或者不能,哪位大神知道结果还希望不吝赐教。

目录
相关文章
|
4月前
|
算法 程序员
【算法训练-二叉树 二】【重建二叉树】依据前序与中序遍历序列重建二叉树
【算法训练-二叉树 二】【重建二叉树】依据前序与中序遍历序列重建二叉树
56 0
|
4月前
|
Java C++ 索引
leetcode-106:从中序与后序遍历序列构造二叉树
leetcode-106:从中序与后序遍历序列构造二叉树
41 0
|
11月前
【LeetCode】105. 从前序与中序遍历序列构造二叉树
题目描述: 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例:
53 0
|
4月前
|
C++ 索引 Python
leetcode-105:从前序与中序遍历序列构造二叉树
leetcode-105:从前序与中序遍历序列构造二叉树
42 0
|
9月前
|
C++ 索引
从中序与后序遍历序列构造二叉树(C++实现)
从中序与后序遍历序列构造二叉树(C++实现)
64 1
|
9月前
|
C++ 索引
从前序与中序遍历序列构造二叉树(C++实现)
从前序与中序遍历序列构造二叉树(C++实现)
70 1
|
C++
力扣 - 106、从中序与后序遍历序列构造二叉树
力扣 - 106、从中序与后序遍历序列构造二叉树
93 0
【LeetCode】-- 105. 从前序与中序遍历序列构造二叉树
【LeetCode】-- 105. 从前序与中序遍历序列构造二叉树
127 0
【LeetCode】-- 105. 从前序与中序遍历序列构造二叉树