这个题跪了好多次居然都是因为读错题了。
它要求在某条路径最小的情况下的叶结点的值。如果存在多条最小路径,则取最小的叶结点。
后序的最后一个结点是根节点。在中序序列中找到该结点的位置,右边是右子树,左边是该结点的左子树。注意要先递归右子树。
直接用后序和中序推出一个树的遍历过程,然后求就行了。用不着建树。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define MAXN 10005
using namespace std;
int rear[MAXN],mid[MAXN];
int hash_mid[MAXN];
int minn,pos,n,ans;
void solve(int a,int b ,int sum)
{
if(a>b) return ;
pos--;
sum+=rear[pos];
if(a==b)
{
if(sum<minn)
{
minn=sum;
ans=rear[pos];
}
else if(sum==minn)
ans=min(ans,rear[pos]);
}
else
{
int c=hash_mid[rear[pos]];
solve(c+1,b,sum);
solve(a,c-1,sum);
}
}
int main()
{
char c;
int temp;
while(scanf("%d%c",&temp,&c)!=EOF)
{
n=0;
memset(hash_mid,0,sizeof(hash_mid));
memset(mid,0,sizeof(mid));
memset(rear,0,sizeof(rear));
mid[n]=temp;
hash_mid[mid[n]]=n;
n++;
if(c!='\n')
{
while(scanf("%d%c",&mid[n],&c))
{
hash_mid[mid[n]]=n;
n++;
if(c=='\n') break;
}
}
n=0;
while(scanf("%d%c",&rear[n],&c))
{
n++;
if(c=='\n') break;
}
minn=10000*10000;
pos=n;
ans=MAXN;
solve(0,n-1,0);
printf("%d\n",ans);
}
return 0;
}