给定二叉树先序、中序遍历序列,求后序遍历

给定一个二叉树的前序遍历和中序遍历的序列,输出对应这个二叉树的后续遍历序列。

输入描述:
输入为一行。
两个字符串,分别表示二叉树的前序遍历和中序遍历结果,用空格分隔。保证数据合法
输出描述:
对应输出后序遍历序列

示例1

输入

ABDEC DBEAC

输出

DEBCA思路:先根据先序、中序序列建立二叉树,然后后序遍历
import java.util.Scanner;

import javax.print.attribute.standard.PresentationDirection;

 class TreeNode {
     char val;
     TreeNode left;
     TreeNode right;
     TreeNode(char x) { val = x; }
 }

public class Main {
    public static  String preStr;
    public static String midStr;

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        int pos = s.indexOf(" ");
        preStr = s.substring(0,pos);
        midStr = s.substring(pos+1,s.length());
        //System.out.println("pre:"+preStr);
        //System.out.println("midS:"+midStr);
        TreeNode rs = creat(preStr,0,preStr.length()-1,midStr,0,midStr.length()-1);
        rView(rs);
    }
    public static void rView(TreeNode root){
        if(root!=null){
            rView(root.left);
            rView(root.right);
            System.out.print(root.val);
        }
    }
    public static TreeNode creat(String preStr,int pstart,int pend,String midStr,int mstart,int mend){
        if(mstart>mend||pstart>pend) return null;
        char[] cmidStr= midStr.toCharArray();
        char[] cpreStr=preStr.toCharArray();
        TreeNode root = new TreeNode(cpreStr[pstart]);
        for(int i = mstart;i<=mend;i++)
            if(cmidStr[i]==cpreStr[pstart]){
                int len = i-mstart;

                root.left = creat(preStr,pstart+1,pstart+len,midStr,mstart,i-1);
                root.right = creat(preStr,pstart+len+1,pend,midStr,i+1,mend);
            }
            return root;
    }

}
时间: 2024-12-30 03:57:23

给定二叉树先序、中序遍历序列,求后序遍历的相关文章

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

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 =

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

由先序遍历和中序遍历序列可唯一还原出二叉树,前提条件是所有节点的关键字无重复. 题目来源: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

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

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

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

已知先序遍历和中序遍历,求后序遍历

描述 先序序列{1,2,4,8,9,5,10,3,6,7};中序序列{8,4,9,2,10,5,1,6,3,7};求后序序列. 代码 class Node{ public int data; public Node left; public Node right; public Node(int data){ this.data=data; this.left=null; this.right=null; } } public class BinaryTree { private Node ro

由二叉树的前序遍历和后序遍历来求后序遍历的结果

假设有棵树,长下面这个样子,它的前序遍历,中序遍历,后续遍历都很容易知道. PreOrder:         GDAFEMHZ InOrder:            ADEFGHMZ PostOrder:       AEFDHZMG 现在,假设仅仅知道前序和中序遍历,如何求后序遍历呢?比如,已知一棵树的前序遍历是"GDAFEMHZ",而中序遍历是"ADEFGHMZ"应该如何求后续遍历? 第一步,root最简单,前序遍历的第一节点G就是root. 第二步,继续观

已知二叉树前、中序遍历,求后序 / 已知二叉树中、后序遍历,求前序

void solve(int start,int end,int root) { // 前序和中序 -> 后序 // 每次调用solve()函数,传入pre-order的start,end,root if (start > end) // 递归边界 return; int i = start; while (i < end && in.at(i) != pre.at(root)) // 找到左右子树的分割点 i++; solve(start, i - 1, root +

给出二叉树先序,中序遍历,求后序遍历

1 #include <cstdio> 2 #include <cstring> 3 4 const int maxn = 100; 5 6 int n; 7 char a[maxn], b[maxn]; 8 9 void dfs(int la, int ra, int lb, int rb) { 10 if (la > ra) 11 return; 12 int md; 13 for (md = la; a[md] != b[lb]; md ++); 14 dfs(la,

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

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

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

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