uva 548 - Tree

给出一个树的中序遍历和一个树的后序遍历各个结点的值。

找出哪条路径到叶子结点的值(为各个结点之和)最小,如果有两条路径的相等,则取结束的结点较小的路径。

输出最后一个结点的值。

用中序遍历和后序遍历递归求路径的和

#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;
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值