您的位置:首页 > 其它

uva 548 Tree

2016-05-25 08:44 357 查看
#include<iostream>
#include<cstdio>
#include<sstream>
using namespace std;
const int maxv=10000+10;
int in_order[maxv],post_order[maxv],lch[maxv],rch[maxv];
int n;
bool read_list(int *a)
{
string line;
if(!getline(cin,line)) return false;
stringstream ss(line);
n=0;
int x;
while(ss>>x) a[n++]=x;
return true;
}
int buildtree(int L1,int R1,int L2,int R2)
{
if(L1>R1) return 0;
int root=post_order[R2];
int p=L1;
while(in_order[p]!=root) p++;
int len=p-L1;
lch[root]=buildtree(L1,p-1,L2,L2+len-1);
rch[root]=buildtree(p+1,R1,L2+len,R2-1);
return root;
}
int best_sum=10000000,best;
void dfs(int u,int sum)
{
sum+=u;
if(!lch[u]&&!rch[u]) {
if(best_sum>sum||(best_sum==sum&&u<best)) {best=u;best_sum=sum;}
}
if(lch[u]) dfs(lch[u],sum);
if(rch[u]) dfs(rch[u],sum);
}
int main()
{
while(read_list(in_order))
{
read_list(post_order);
buildtree(0,n-1,0,n-1);
int u=post_order[n-1];
best_sum=1000000;
dfs(u,0);
cout<<best<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: