uva 548 - Tree

来源:互联网 发布:淘宝快递单模板 编辑:程序博客网 时间:2024/05/29 04:36
这道是道基础的二叉树题目,可以说帮我好好巩固了二叉树递归遍历的思想,有个地方要注意,就是路径和的最小值一开始初始化一定要足够大,不然会WA,因为一个节点的数字大小最大就有1万了。这个地方一定要注意。还有就是解题的关键就是,当p=0且n-p-1=0时就到叶节点了,其实就是n=1,p=0的时候,写的谨慎点就是p<=0&&n-p-1<=0。此时就可以判断sum和min1的大小了。下面是ac 代码
#include<cstdio>#include<ctype.h>#include<algorithm>#include<iostream>#include<string.h>using namespace std;int inorder[10000+10],postorder[10000+10];int min1, record;void build(int n, int *s1, int *s2,int sum){    int p,i;    if(n <= 0)        return;    for(i = 0;i < n; i++)        if(s2[n-1] == s1[i])            p = i;    sum+=s2[n-1];    if(p <= 0 && n-p-1 <= 0)    {        if(sum == min1)            record = s2[0] > record ? record :s2[0];        if(sum < min1)        {            min1 = sum;            record = s2[0];        }    }    build(p, s1, s2, sum);    build(n-p-1, s1+p+1, s2+p, sum);}int main(){//    freopen("input.txt","r",stdin);    int n,i;    char ch;    while(scanf("%d",&inorder[0]) == 1)    {        ch = getchar();        for(i = 1; ch != '\n'; i++)        {            scanf("%d",&inorder[i]);            ch = getchar();        }        n = i;        for(i = 0;i < n; i++)        {            scanf("%d",&postorder[i]);            ch = getchar();        }        min1 = record = 1000000;//这个千万不能设置小,特别是min1的值,因为一个节点最大是1万        //求到叶节点的路径和就可能非常大了        build(n,inorder,postorder,0);        printf("%d\n",record);    }    return 0;}

0 0