前序遍历与中序遍历确定后序遍历

1003. 二叉树后序遍历

 
 
Total: 137 Accepted: 80
 
     
     
 

Time Limit: 3sec    Memory Limit:256MB

Description

给定一棵二叉树的前序和中序遍历顺序,输出后序遍历顺序

Input

第一行是二叉树的前序遍历顺序。二叉树的结点个数<=26,每个结点以一个大写字母表示,结点字母之间没有间隔。第二行是这棵二叉树的中序遍历顺序,表示方法和前序相同。(注:在左子树和右子树之间总是先左后右)

Output

输出二叉树后序遍历的顺序

Sample Input

 Copy sample input to clipboard

GDAFEMHZ
ADEFGHMZ

Sample Output

AEFDHZMG

通过前序遍历与中序遍历可以唯一确定二叉树

我们先重建一棵二叉树

再后序遍历

#include <iostream>
#include <string>
using namespace std;  

//结点类
struct Node
{
    Node * lchild;
    Node * rchild;
    char c;
};
//重建后续排序二叉树
Node * rebuild(string s1, string s2)
{
    //建立根结点
    Node * t=NULL;  //一定要初始化为NULL,不然报错
    if(s1.size()>0){
        t=new Node;
        t->c=s1[0];
        t->lchild=NULL;
        t->rchild=NULL;
    }
    if(s1.size()>1){
        //寻找根结点在中序遍历中的位置
        int root;
        for(int i=0; i<s2.size(); i++){
            if(s2[i]==t->c){
                root=i;
                break;
            }
        }
        //左子树重建
        string qianxu_left=s1.substr(1, root); //注意substr的用法,第二个参数是子字符串长度
        string zhongxu_left=s2.substr(0, root);
        t->lchild=rebuild(qianxu_left, zhongxu_left);
        //右子树重建
        string qianxu_right=s1.substr(root+1, s1.size()-root-1);
        string zhongxu_right=s2.substr(root+1, s2.size()-root-1);
        t->rchild=rebuild(qianxu_right, zhongxu_right);
    }  

    return t;
}
//后序遍历:左右根
void houxu(Node * t)
{
    //左子树非空,遍历左子树
    if(t->lchild!=NULL)
        houxu(t->lchild);
    //右子树非空,遍历右子树
    if(t->rchild!=NULL)
        houxu(t->rchild);
    //取出该结点的值
    cout<<t->c;
}  

int main()
{
    string s1, s2;
    cin>>s1>>s2;
            Node * t=rebuild(s1, s2);
        houxu(t);
        cout<<endl;    

    return 0;
}

  

时间: 2024-10-11 06:32:38

前序遍历与中序遍历确定后序遍历的相关文章

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

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

通过二叉树的中序序列和后序序列获取前序序列

二叉树的遍历方式常见的三种是:先序遍历(ABC).中序遍历(BAC).后序遍历(BCA) 先序遍历: 若二叉树为空,则空操作:否则: 访问根结点; 先序遍历左子树: 先序遍历右子树. 中序遍历: 若二叉树为空,则空操作:否则: 中序遍历左子树: 访问根结点: 中序遍历右子树. 后序遍历: 若二叉树为空,则空操作:否则: 后序遍历左子树: 后序遍历右子树: 访问根结点. 在学习到 根据遍历序列确定二叉树 时,知道了:可以通过二叉树的先中或者中后遍历序列唯一确定一棵二叉树. 根据算法描述 使用jav

中序表达式转后序表式式

中序表达式转后序表式式: 将中序表达式所有括号补全,然后将所有运算符向右移出无匹配的第一个右括号,去掉括号即为后序表式式 举例: 原式:a+b*(c+d/e) 补全括号:(a+(b*(c+(d/e)))) 操作符右移:(a(b(c(de)/)+)*)+ 去掉括号:abcde/+*+ 中序表达式转前序表式式: 将中序表达式所有括号补全,然后将所有运算符向左移出无匹配的第一个左括号,去掉括号即为前序表式式 举例: 原式:a+b*(c+d/e) 补全括号:(a+(b*(c+(d/e)))) 操作符右移

算法进化历程之“根据二叉树的先序和中序序列输出后序序列”

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 前不久在看到一个作业"根据二叉树的先序和中序序列输出后序序列",当时我参考<数据结构与算法(C语言)习题集>上的做法,先根据先中序序列确定一颗二叉树,然后后序遍历二叉树输出后序序列. 函数采用了递归算法,利用函数传入的先序和中序序列的左右边界,确定要处理的序列段,生成相应的二叉树. 基本思路是,把该段先序序列的第一个元素作为当前二叉树的根结点,然后在中序序列找到根结点.根结点

先序序列和后序序列并不能唯一确定二叉树

数据结构的基础知识中重要的一点就是能否根据两种不同遍历序列的组合(有三种:先序+中序,先序+后序,中序+后序),唯一的确定一棵二叉树.然后就是根据二叉树的不同遍历序列(先序.中序.后序),重构二叉树.显然,这三种组合并不是都能唯一确定二叉树的,其中先序+后序就不能唯一确定一棵二叉树,其他两种组合可以唯一的确定一颗二叉树. 由先序序列和后序序列不能唯一确定一棵二叉树,因无法确定左右子树两部分. 反例:任何结点只有左子树的二叉树和任何结点只有右子树的二叉树,其前序序列相同,后序序列相同,但却是两棵不

HDU 1710Binary Tree Traversals(已知前序中序,求后序的二叉树遍历)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1710 解题思路:可以由先序和中序的性质得到 : 先序的第一个借点肯定是当前子树的根结点, 那么在 中序中找到这个结点, 则这个结点左边的节点属于左子树, 右边的属于右子树.然后递归遍历就可以了. 样例: 9 1 2 4 7 3 5 8 9 6 4 7 2 1 8 5 9 3 6 7 4 2 8 9 5 6 3 1 如图: 因此,用深搜就能轻松解决了,注意DFS中的变量,以及向清楚DFS的条件,这题就

[经典算法] 中序式转后序式/前序式

题目说明: 平常所使用的运算式,主要是将运算元放在运算子的两旁,例如a+b/d这样的式子,这称之为中序(Infix)表示式,对于人类来说,这样的式子很容易理 解,但由于电脑执行指令时是有顺序的,遇到中序表示式时,无法直接进行运算,而必须进一步判断运算的先后顺序,所以必须将中序表示式转换为另一种表示方 法.可以将中序表示式转换为后序(Postfix)表示式,后序表示式又称之为逆向波兰表示式(Reverse polish notation),它是由波兰的数学家卢卡谢维奇提出,例如(a+b)*(c+d

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

7.5 中序式转后序式

7-6 toPosfix.c 1 #include <stdio.h> 2 #include <stdlib.h> 3 int PRI(char op) //设定算符的优先级 4 { 5 switch (op) 6 { 7 case '+': 8 case '-': 9 return 1; 10 case '*': 11 case '/': 12 return 2; 13 default: 14 return 0; 15 } 16 } 17 char *toPosfix(char

中序表达式 to 后序表达式

将带有计算的优先级和括号的中序表达式变成符合某文法的后序表达式. <编程导论(Java)·5.5.2>的参考资料 解释器模式中或许需要的工具 直接上代码. package intent.interpreter.calculator2; import java.util.HashMap; import java.util.Stack; import tool.God; public class Nothing{ private static HashMap<Character,Intege