求从根节点开始到叶子节点和的最小值,用中序和后序的性质建树,中序根节点左右分别是左右子树,后序最后的点是根节点,递归找最小值的叶子
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXN 100010
int mid[MAXN],post[MAXN],leaf,min;
void find(int mi,int mj,int pi,int pj,int sum)
{
if(mj<mi)
return;
int i;
int pos;
if(mi==mj)
{
sum+=mid[mi];
if(min==sum&&leaf>mid[mi])
leaf=mid[mi];
else if(min>sum)
{
min=sum;
leaf=mid[mi];
}
}
else
{
for(i=mi;i<=mj;i++)
if(mid[i]==post[pj])
{
pos=i;break;
}
sum+=post[pj];
find(mi,pos-1,pi,pi+pos-mi-1,sum);
find(pos+1,mj,pi+pos-mi,pj-1,sum);
}
}
int main()
{
int i,j;
char ch;
i=0;
while(scanf("%d%c",&mid[i++],&ch)==2)
{
if(ch==32)
continue;
if(ch=='\n')
{for(j=0;j<i;j++)
scanf("%d",&post[j]);
//getchar();
min=99999999;leaf=9999999;
find(0,i-1,0,i-1,0);
printf("%d\n",leaf);
i=0;}
}
return 0;
}