已知二叉树的先序遍历和中序遍历序列求后序遍历序列

package algorithm01;

import java.util.Scanner;

/**
 * 给出先序遍历和中序遍历序列求出二叉树的后续遍历序列
 * @author wxisme
 *
 */

public class ToReverse {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String s1, s2;
		while(scan.hasNext()) {
			s1 = scan.next();
			s2 = scan.next();
			build(s1.length(), 0, 0, s1, s2);

		}
	}

	public static void build(int n, int s1_at, int s2_at, String s1, String s2) {
		if(n <= 0) return;
		//求出根节点在中序遍历中的位置
		int p = s2.indexOf(s1.charAt(s1_at)) - s2_at;
		//后续遍历左子树
		build(p, s1_at+1, s2_at, s1, s2);
		//后续遍历右子树
		build(n-p-1, s1_at+p+1, s2_at+p+1, s1, s2);
		//访问根节点
		System.out.print(s1.charAt(s1_at));
	}

}

测试:

DBACEGF ABCDEFG
   ACBFGED
   BCAD CBAD
   CDAB

时间: 2024-08-11 01:35:22

已知二叉树的先序遍历和中序遍历序列求后序遍历序列的相关文章

hdu1710-Binary Tree Traversals (由二叉树的先序序列和中序序列求后序序列)

http://acm.hdu.edu.cn/showproblem.php?pid=1710 Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4210    Accepted Submission(s): 1908 Problem Description A binary tree is a

根据二叉树的先序遍历序列和中序遍历序列求后序遍历序列

由先序遍历和中序遍历序列可唯一还原出二叉树,前提条件是所有节点的关键字无重复. 题目来源:http://hihocoder.com/problemset/problem/1049 代码: 1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 void post_order(string pre, string in) 7 { 8 size_t len = pre.length(); 9 if(l

已知二叉树的中序遍历和先序/后序遍历求后序/先序

已知两种遍历序列求原始二叉树 算法思想: 需要明确的前提条件 通过先序和中序可以求出原始二叉树 通过中序和后序可以求出原始二叉树 但是通过先序和后序无法还原出二叉树 换种说法: 只有通过先序中序或者后序中序才可以确定一个二叉树 先来看一个例子,已知先序遍历序列和中序遍历序列求后序遍历: 先序:ABCDEFGH 中序:BDCEAFHG 求后序: 分析:要求后序遍历序列,必须求出原始二叉树 先看先序序列A第一个出现,有先序遍历的定义可以知道A是根结点 再看中序遍历,A的左边是BDCE,而A的右边是F

已知二叉树的前序遍历结果和中序遍历结果,请重建原来的二叉树

分析的过程: 1.假设前序遍历的第一个值为a,该值就是原二叉树的根节点. 2.在中序遍历结果中查找a. 则在中序遍历中a前面的节点,就是原二叉树a节点左子树的中序遍历结果:在a后面的节点,就是原二叉树a节点右子树的中序遍历结果. 3.由第二步得到a节点左子树的节点个数为m,那么在前序遍历中a后面的m个节点即为a节点左子树的前序遍历结果: 4.由第二步得到a节点右子树的节点个数为n,那么在前序遍历中最后n个节点即为a节点右子树的前序遍历结果: 由此我们可以得到a节点左子树和右子树的前序遍历和中序遍

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

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

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

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

已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?

对一棵二叉树进行遍历,我们可以采取3中顺序进行遍历,分别是前序遍历.中序遍历和后序遍历.这三种方式是以访问父节点的顺序来进行命名的.假设父节点是N,左节点是L,右节点是R,那么对应的访问遍历顺序如下: 前序遍历    N->L->R 中序遍历    L->N->R 后序遍历    L->R->N /***************************************************************************************

已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列

题目描述 输入二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列. 输入 第一行输入二叉树的先序遍历序列: 第二行输入二叉树的中序遍历序列. 输出 输出该二叉树的后序遍历序列. 示例输入 ABDCEF BDAECF 示例输出 DBEFCA #include <iostream> #include <cstring> #define MAX 50+3 using namespace std; typedef char Elem_Type; typedef struct B

已知二叉树的先序,中序遍历,求后续遍历

//已知二叉树的先序,中序遍历,求后续遍历 struct TreeNode { char elem; struct TreeNode* left; struct TreeNode* right; }; TreeNode* BinaryTree(char* inorder,char* preorder,int length) { if(length == 0) return NULL; TreeNode* node = new TreeNode; node->elem = *preorder; i