给出一个树的中序遍历和一个树的后序遍历各个结点的值。
找出哪条路径到叶子结点的值(为各个结点之和)最小,如果有两条路径的相等,则取结束的结点较小的路径。
输出最后一个结点的值。
用中序遍历和后序遍历递归求路径的和
#include<cstdio>
#include<cstring>
#include<limits.h>
const int MAX1=1e8+100;
const int MAXN=10000+10;
int a[MAXN],b[MAXN],n,min,ans;
int find(int temp,int front,int rear){ //找到根结点在中序遍历中的下标
int i;
for(i=front;i<=rear;i++)
if(temp==a[i]) return i;
}
void solve(int a_front ,int a_rear,int b_front , int b_rear,int sum){
//a_front为该树中序遍历的起始点,a_rear为中序遍历的终点,
//b_front为后序遍历的起始点,b_front为后序遍历的终点。
//sum为到该结点的和。如果只有一个结点,则判断后返回
if(a_front==a_rear){
sum+=a[a_front];
if(sum<min) {min=sum; ans=a[a_front];}
else if(sum==min) {if(a[a_front]<ans) ans=a[a_front];}
return ;
}
if(a_front>a_rear) return ;
sum += b[b_rear];
int q = find(b[b_rear],a_front,a_rear);
solve( a_front, q-1, b_front ,b_front+q-a_front-1,sum); //递归左子树
solve( q+1 , a_rear, b_front+q-a_front,b_rear-1 ,sum); //递归右子树
}
int main(){
//freopen("in.txt","r",stdin);
while(1){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
min=MAX1;ans=MAXN;
for(n=1;;n++){
if(scanf("%d",&a[n])==EOF) return 0;
char c=getchar();
if(c=='\n') break;
}
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
solve(1,n,1,n,0);
printf("%d\n",ans);
}
return 0;
}