UVA536 二叉树重建 Tree Recovery

根据先序和中序确定后序。树中每个结点的值都是不同的,不需要特判了。

递归构造完左右子树后输出根即为后序。

string pre,in;
unordered_map<char,PII> tree;
unordered_map<char,int> pos;

int build(int prel,int prer,int inl,int inr)
{
    if(prel > prer) return -1;

    char root=pre[prel];
    int k=pos[root];
    int leftlen=k-inl;
    int lchild=build(prel+1,prel+leftlen,inl,k-1);
    int rchild=build(prel+leftlen+1,prer,k+1,inr);
    cout<<root;
    tree[root]={lchild,rchild};
    return root;
}

int main()
{
    while(cin>>pre>>in)
    {
        for(int i=0;i<in.size();i++) pos[in[i]]=i;
        build(0,pre.size()-1,0,in.size()-1);
        cout<<endl;
    }
    //system("pause");
    return 0;
}

(update)
对代码作了些许简化。

string pre,in;
unordered_map<char,int> pos;

int build(int prel,int prer,int inl,int inr)
{
    if(prel > prer) return -1;

    char root=pre[prel];
    int k=pos[root];
    int leftlen=k-inl;
    build(prel+1,prel+leftlen,inl,k-1);
    build(prel+leftlen+1,prer,k+1,inr);
    cout<<root;
    return root;
}

int main()
{
    while(cin>>pre>>in)
    {
        for(int i=0;i<in.size();i++) pos[in[i]]=i;
        build(0,pre.size()-1,0,in.size()-1);
        cout<<endl;
    }
    //system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/fxh0707/p/14323606.html