zoukankan      html  css  js  c++  java
  • 后序遍历

    后序遍历

    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    在参与过了美食节之后,小Hi和小Ho在别的地方又玩耍了一阵子,在这个过程中,小Ho得到了一个非常有意思的玩具——一棵由小球和木棍连接起来的二叉树

    小Ho对这棵二叉树爱不释手,于是给它的每一个节点都标记了一个标号——一个属于A..Z的大写字母,并且没有任意两个节点的标号是一样的。小Hi也瞅准了这个机会,重新巩固了一下小Ho关于二叉树遍历的基础知识~就这样,日子安稳的过了两天。

    这天,小Ho正好在求解这棵二叉树的前序、中序和后序遍历的结果,但是却在求出前序遍历和中序遍历之后不小心把二叉树摔到了地上,小球和木棍等零件散落了一地!

    小Ho损失了心爱的玩具,正要嚎啕大哭起来,所幸被小Hi发现了,劝说道:“别着急,这不是零件都还在么?拼起来不就是了?”

    “可是我忘记了二叉树长什么样子了!”小Ho沮丧道。

    “这个简单,你不是刚刚求出了这棵二叉树的前序和中序遍历的结果么,利用这两个信息就可以还原出整棵二叉树来哦!”

    “这样么?!!”小Ho止住了泪水,问道:“那要怎么做呢?”

    没错!小Ho在这一周遇到的问题便是:给出一棵二叉树的前序和中序遍历的结果,还原这棵二叉树并输出其后序遍历的结果。

    提示:分而治之——化大为小,化小为无

    输入

    每个测试点(输入文件)有且仅有一组测试数据。

    每组测试数据的第一行为一个由大写英文字母组成的字符串,表示该二叉树的前序遍历的结果。

    每组测试数据的第二行为一个由大写英文字母组成的字符串,表示该二叉树的中序遍历的结果。

    对于100%的数据,满足二叉树的节点数小于等于26。

    输出

    对于每组测试数据,输出一个由大写英文字母组成的字符串,表示还原出的二叉树的后序遍历的结果。

    样例输入
    AB
    BA
    样例输出
       BA
    分析:前序遍历的第一个字符是根,根据这个根可以将中序遍历的左子树,右子树找出来,
       根据这些长度又可以把前序遍历左子树,右子树找出来,接下来继续递归就好了;
    代码:
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    #include <climits>
    #include <cstring>
    #include <string>
    #include <set>
    #include <map>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <list>
    #define rep(i,m,n) for(i=m;i<=n;i++)
    #define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
    #define vi vector<int>
    #define pii pair<int,int>
    #define mod 1000000007
    #define inf 0x3f3f3f3f
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define ll long long
    #define pi acos(-1.0)
    const int maxn=1e5+10;
    const int dis[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
    using namespace std;
    ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
    ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}
    int n,m;
    string a,b;
    string dfs(string p,string q)
    {
        int i,len=p.length();
        if(len<=2){reverse(p.begin(),p.end());return p;}
        string c,d,e,f;
        for(i=0;q[i]!=p[0];i++);
        d=q.substr(0,i),f=q.substr(i+1,len-i-1);
        c=p.substr(1,i),e=p.substr(i+1,len-i-1);
        return dfs(c,d)+dfs(e,f)+p[0];
    }
    int main()
    {
        int i,j,k,t;
        cin>>a>>b;
        cout<<dfs(a,b)<<endl;
        //system ("pause");
        return 0;
    }
  • 相关阅读:
    网上流行的学生选课相关的50个常用sql语句
    the interview questions of sql server
    ASP.NET 之 Chart Control for .Net Framework
    SQL Server之纵表与横表互转
    ASP.NET控件之RadioButtonList
    SQL Server通过钉钉机器人直接发送消息
    使用AMO对象,更改款属性名称
    常用MDX函数
    Excel 插入图片
    Sql Server 2008查询数据库中各表记录行数
  • 原文地址:https://www.cnblogs.com/dyzll/p/5737867.html
Copyright © 2011-2022 走看看