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;
}