好多细节,自己的代码改了好多遍,最后改成源码。。。
有时间再敲一遍。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<sstream>
using namespace std;
const int maxn = 10000 + 10;
int in_order[maxn],post_order[maxn],lch[maxn],rch[maxn];
int n;
bool input(int *a)
{
string s;
while(!getline(cin,s))return false;
stringstream ss(s);
n=0;
int x;
while(ss>>x)a[n++]=x;
return n>0;
}
int buildtree(int L1,int R1,int L2,int R2)//返回树的根值
{
if(L1>R1)return 0;//说明没有子树了,返回0
int root = post_order[R2];
int p = L1;
while(in_order[p]!=root)
p++;
int cnt = p-L1;
lch[root]=buildtree(L1,p-1,L2,L2+cnt-1);//第四个参数不能直接写成p-1,因为L1不一定等于L2
rch[root]=buildtree(p+1,R1,L2+cnt,R2-1);
return root;
}
int best,best_sum;
void dfs(int u,int sum)
{
sum+=u;
if(!lch[u]&&!rch[u])
{
if(sum<best_sum||(sum==best_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(input(in_order))
{
input(post_order);
for(int i=0;i<n;i++)
cout<<in_order[i]<<" ";
cout<<endl;
for(int i=0;i<n;i++)
cout<<post_order[i]<<" ";
cout<<endl;
}*/
while(input(in_order))
{
input(post_order);
buildtree(0,n-1,0,n-1);
best_sum=100000000;
dfs(post_order[n-1],0);
printf("%d\n",best);
}
return 0;
}