题意
按先序给出二叉树,规定节点距离它的左右儿子水平距离为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
分析
- 二叉树先序递归输入,可以直接输入时判断结果;
- 将二叉树放在一个坐标轴上,根节点为零点,用一个数组sum表示每个竖直线上的节点之和。递归时判断即可
#include<bits/stdc++.h>
using namespace std;
const int N = 200 + 10;
const int INF = 0x3f3f3f3f;
int cnt = 1;
int sum[N];
void build(int p) //递归输入子树,p为根节点坐标
{
int v;
cin >> v;
if(v == -1)
return; //遇到空树返回
sum[p] += v; //典型的先序遍历,根节点
build(p - 1); // 左子树
build(p + 1); // 右子树
}
bool input()
{
int v;
cin >> v;
if(v == -1)
return false;
memset(sum, 0, sizeof(sum));
int pos = N / 2; //树根水平位置
sum[pos] = v; //确定“坐标零点”
build(pos - 1);
build(pos + 1);
return true;
}
int main()
{
while(input()){
int p = 0;
while(sum[p] == 0)
p++; //找最左边的叶子
cout << "Case " << cnt++ << ":" << endl;
cout << sum[p++];
while(sum[p])
cout << " " << sum[p++];
cout << "\n\n";
}
return 0;
}