#include<cstring>
#include<iostream>
using namespace std;
const int maxn = 200;
int sum[maxn];
void build(int p) {
int v;
cin >> v;
if(v == -1) return;
sum[p] += v;//p指的是枝叶的水平位置
build(p - 1);
build(p + 1);
}
//边读入边统计
bool init() {//建立树根
int v;
cin >> v;
if(v == -1) return false;
memset(sum, 0, sizeof(sum));
int pos = maxn/2; //* 树根的水平位置,即maxn的一半,这样可以保证空间充足
sum[pos] = v;
build(pos - 1);//左子树
build(pos + 1);//右子树
// 上面是建立子树的方法
}
int main() {
int kase = 0;
while(init()) {//当树根不为-1时
int p = 0;
while(sum[p] == 0) p++;
cout << "Case " << ++kase << ":\n" << sum[p++];//从数组的左边向右边输出最左边的数
while(sum[p] != 0) {
cout << " " << sum[p];//输出p
p++;
}
cout << "\n\n";
}
return 0;
}
/*
总结:
本题的思路首先是判断并建立树根,确立树根的水平位置,然后在建立枝叶,如果枝叶的水平位置相同
就累加。然后输出即可。
可学到的有确立树根的水平位置和边读入边统计。
*/