您的位置:首页 > 其它

例题:下落的树叶

2016-09-24 22:31 113 查看
给一颗二叉树,每个节点都有一个水平位置:左子节点在它左边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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: