给一颗二叉树,每个节点都有一个水平位置:左子节点在它左边1个单位,右子节点在右边1个单位。从左向右输出每个垂直位置的所有节点的权值之和。如图所示,从左到右的3个位置权和分别为7,11,3。按照递归(先序)方式输入,用-1表示空树。
Sample Input
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
Sample Output
Case 1:
7 11 3
Case 2:
9 7 21 15
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
const int maxn = 100;
int sum[maxn];
//输入并统计一颗子树,树根水平位置为p
void build(int p)
{
int v; cin >> v;
if (v == -1)return;
sum[p] += v;
build(p - 1);
build(p + 1);
}
//边读入边统计,深度优先输入法
bool init()
{
int v; cin >> v;
if (v == -1)
return false;
int pos = maxn / 2;
sum[pos] = v;
build(pos - 1);//按照递归(先序)方式输入
build(pos + 1);
return true;
}
int main()
{
int kase = 0;
while (init())
{
int p = 0;
while (sum[p] == 0)p++;//找出最左边的叶子
cout << "Case " << ++kase << ":\n" << sum[p++];
while (sum[p] != 0)
cout << " " << sum[p++];
}
return 0;
}