题目链接
题目大意:
给一棵二叉树,每个结点都有一个水平位置:左子结点在它左边1个单位,右子结点在右边1个单位。按照递归(先序)方式输入,用-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
解题思路:
发现这种先序输入的二叉树结构采用递归方式来解决问题真的是特别方便!
AC代码:
#include<iostream>
#include<stdio.h>
using namespace std;
#define maxn 10005
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() {
for (int i = 0; i < maxn; i++)sum[i] = 0;
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 t = 0;
while (init()) {
int p = maxn / 2;
while (sum[p] != 0)p--;
cout << "Case " << ++t << ":\n" << sum[p + 1];
for (int i = p + 2; i < maxn; i++) {
if (sum[i] == 0)break;
cout << " " << sum[i];
}
cout << "\n\n";
}
return 0;
}