数据结构 uva-699-The Falling Leaves

 

题目链接:

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=104&page=show_problem&problem=640

 

题目意思:

给一颗二叉树,让你按左到右的顺序,输出同一水平位置的所有节点的值的总和。

 

解题思路:

用递归建树,在建树的过程中就把每一水平位置上的总和求出来。在这里我把树根的位置记为150,然后左孩子的位置就为直系父亲位置减1,右孩子为直系父亲位置加1.

 

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<stack>
#include<queue>
#define eps 1e-6
#define INF (1<<20)
#define PI acos(-1.0)
using namespace std;

int ans[330];

void tree(int cur,int loc)
{
    if(cur==-1)  //遇到叶子节点,则返回
        return ;
    ans[loc]+=cur; //否则在该位置上加上该值

    int left,right;

    scanf("%d",&left);
    tree(left,loc-1);  //左孩子,位置为父亲的位置减1

    scanf("%d",&right);
    tree(right,loc+1);  //右孩子,位置为父亲的位置加1

    return ;
}


int main()
{
    int cur,ca=0;

    while(scanf("%d",&cur)&&cur!=-1)
    {

        memset(ans,0,sizeof(ans));
        tree(cur,150);  //将150置为初始位置

        int i;

        for(i=1;i<=300;i++)  //去掉前面的0
            if(ans[i])
                break;
        if(i==301)
            continue;
        printf("Case %d:\n%d",++ca,ans[i]);
        for(++i;i<=300;i++)  //输出不为0的和值
            if(ans[i])
                printf(" %d",ans[i]);
        printf("\n\n");

    }

    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值