UVA699 The Falling Leaves 递归建树
题意翻译
每年秋天,在中北部地区叶子的颜色都会变得鲜艳,树叶也迅速地跟着落下。如果同样的事情发生了在二叉树上,那么这些树叶堆有多大? 我们假设一个二叉树中的每个节点都会在那个节点落下一个等于整数值的叶子数。 我们还假设这些叶子垂直地落在地上(谢天谢地,没有风吹过他们周围)。最后,我们假设节点是水平放置的。这样一个节点的左、右子节点恰好是一个左边的单位,另一个是一个右边的单位 考虑右边的下面的树: 包含5和6的节点具有相同的水平位置。(当然,有不同的垂直位置)。 节点包含7是一个单位,左边的那些包含5和6,包含3的节点是其右边的一个单位。什么时候。“叶子”从这些节点上落下,形成三个堆:最左边的一个有7片(最左边的节点)下一个有11片(包含5和6的节点中叶片数之和),以及最右边的堆有3片。
输入
输入包含多个询问,每组询问描述一个树。树是先指定给在根节点中的值,之后是左子树的描述,然后是右子树的描述。如果为空子树,则值为“- 1”。因此,上图显示的树是给定的。 “5 - 7 - 1 - 6 - 1 - 1 - 3 - 1 - 1”。每个实际树节点都包含一个正的非零值。最后的测试询问后面是一个‘-1’
输出
对于每一个询问,在一行中显示用例号(它们按顺序编号,以1开始)。 本身。在下一行显示每一堆的“叶子”的数目,从左到右,用一个 (空格) 分隔每个值的空间。每两个询问之间用一个空白行隔开。此输出必须从第1行开始,并且不会超过80行。按空白行跟踪每个询问的输出。此格式见样例输出 翻译贡献者UID:75392
题目描述
输入输出格式
输入格式:
输出格式:
输入输出样例
输入样例#1: 复制
5 7 -1 6 -1 -1 3 -1 -1 8 2 9 -1 -1 6 5 -1 -1 12 -1 -1 3 7 -1 -1 -1 -1
输出样例#1: 复制
Case 1: 7 11 3 Case 2: 9 7 21 15
很简单的递归建树,唯一的问题就是根节点在数组中位置不能为0,否则会越界
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1000010;
int kase,sum[maxn];
void build(int cur)
{
int x;
scanf("%d", &x);
if (x == -1)
return;
sum[cur] += x;
build(cur - 1);
build(cur + 1);
}
bool init()
{
memset(sum, 0, sizeof(sum));
int x;
scanf("%d", &x);
if (x == -1)
return false;
int cur = maxn / 2;
sum[cur] += x;
build(cur - 1);
build(cur + 1);
return true;
}
int main()
{
while (init())
{
printf("Case %d:\n", ++kase);
int p = 0;
while (!sum[p])
p++;
printf("%d", sum[p++]);
for (int i = p; sum[i]; i++)
printf(" %d", sum[i]);
printf("\n");
printf("\n");
}
return 0;
}