UVa:548 Tree

来源:互联网 发布:奥贵银软件下载 编辑:程序博客网 时间:2024/05/20 07:16

这个题跪了好多次居然都是因为读错题了。

它要求在某条路径最小的情况下的叶结点的值。如果存在多条最小路径,则取最小的叶结点。

后序的最后一个结点是根节点。在中序序列中找到该结点的位置,右边是右子树,左边是该结点的左子树。注意要先递归右子树。

直接用后序和中序推出一个树的遍历过程,然后求就行了。用不着建树。

 

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#define MAXN 10005using 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;}


 

0 0
原创粉丝点击