Uva699 The Falling Leaves(二叉树与递归)

 题解:给你一个先序二叉树,其中左子结点在父节点左一个单位,右节点在父节点右一个单位;让从左到右输出每个水平位置的权值和;本来用的从1开始root<<1建树,发现思路行不通;因为每个节点的root不同,所以考虑到从MAXN/2开始,-1,+1进行建树不就可以了么,每次如果不等于-1,就加上权值,然后找到左边最小的root,右边最大的root输出答案即可;

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>

using namespace std;

const int maxn=100010;
int tree[maxn];
int flag,cnt;
int l,r;


void solve(int root)
{
    int x;cin>>x;
    if(!cnt&&x==-1) {flag=0;return;}
    cnt=1;

    if(x!=-1)
    {
        l=min(l,root);
        r=max(r,root);
        tree[root]+=x;
        solve(root-1);solve(root+1);
    }

}

int main(){
    int kase=0;
    while(true){
        flag=1;
        memset(tree,0,sizeof(tree));
        l=r=maxn/2;
        cnt=0;
        solve(maxn/2);
        if(!flag)break;
        printf("Case %d:
",++kase);
        for(int i=l;i<=r;i++){
            if(i!=l)printf(" ");printf("%d",tree[i]);
        }
        puts("
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Fy1999/p/9431478.html