UVa548树

题目大意:给出一棵树的中序遍历和后序遍历,要求你根据此得出从根节点到叶子节点路径上权值和最小时叶子节点的值

本题最简单的思路是先根据中序遍历和后序遍历构建出整棵树,然后再用深度优先搜索来确定叶子的值。

但我缺省掉了dfs的过程,再构建树的过程中完成统计并输出结果的值。下面附上我c语言的代码

这里只给出了单例的代码,如需符合多例,读者可自行修改!

#include <stdio.h>

int best = -1,best_sum;
int in[10000],post[10000],cnt = 0;
char str[60000];

int next(int pos){
    int i;
    for(i = pos;str[i] != '\0';i++){
        if(str[i] < '0' || str[i] > '9')continue;
        if(i - 1 < 0 || str[i - 1] == ' ')return i;
    }
    return -1;
}

void init(){
    int i;
    gets(str);
    for(i = next(0);i != -1;i = next(i+1))
        sscanf(str+i,"%d",&in[cnt++]);
    cnt = 0;
    gets(str);
    for(i = next(0);i != -1;i = next(i+1))
        sscanf(str+i,"%d",&post[cnt++]);
}

int find(int v){
    int i;
    for(i = 0;i < cnt;i++)
        if(in[i] == v)return i;
    return -1;
}

void build(int b1,int e1,int b2,int e2,int sum){//sum表示到目前位置的和为多少
    if(b1 > e1 || b2 > e2)return;
    int pos = find(post[e2]);
    sum += post[e2];
    if(b1 == e1){
        if(best<0 || sum<best_sum || (sum == best_sum && post[e2]<best)){
            best = post[e2];
            best_sum = sum;
        }
    }
    build(b1,pos-1,b2,b2+pos-b1-1,sum);
    build(pos+1,e1,b2+pos-b1,e2-1,sum);
}

int main(){
    init();
    build(0,cnt-1,0,cnt-1,0);
    printf("%d\n",best);
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值