二叉树重构(知后序中序求前序)

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
#define fo freopen("in.txt","r",stdin)
#define fc fclose(stdin)
#define fu0(i,n) for(i=0;i<n;i++)
#define fu1(i,n) for(i=1;i<=n;i++)
#define fd0(i,n) for(i=n-1;i>=0;i--)
#define fd1(i,n) for(i=n;i>0;i--)
#define mst(a,b) memset(a,b,sizeof(a))
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d %d",&n,&m)
#define ss(s) scanf("%s",s)
#define sddd(n,m,k) scanf("%d %d %d",&n,&m,&k)
#define pans() printf("%d\n",ans)
#define all(a) a.begin(),a.end()
#define sc(c) scanf("%c",&c)
#define we(a) while(scanf("%d",&a)!=EOF)
const int maxn=200005;
const double eps=1e-8;
char post[maxn],in[maxn];
map<char ,char> lch,rch;
char pre[maxn];

char build(int l1,int r1,int l2,int r2) //l1,r1表示中序,l2,r2表示后序
{
    if(l1>r1)
        return '#';
    char root= post[r2];
    int p=l1;
    while(in[p]!=root)
    {
        p++;
    }
    int cnt=p-l1;
    lch[root]=build(l1,p-1,l2,l2+cnt-1);
    rch[root]=build(p+1,r1,l2+cnt,r2-1);
    return root;
}
int t=0;
void previs(char a)
{
    if(a=='#')
    return ;
     pre[t++]=a;
     previs(lch[a]);
     previs(rch[a]);
}
int main()
{
    cin>>post>>in;
    int n=strlen(post);

    cout<<n<<endl;
    build(0,n-1,0,n-1);
    previs(post[n-1]);
    for(int i=0;i<n;i++)
    {
        cout<<pre[i];
    }
    cout<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/dilly__dally/article/details/81119456
今日推荐