下落的树叶 The Falling Leaves
题述
给一棵二叉树,每个结点都有一个水平位置:左子结点在它的左边一个单位,右子结点在它的右边一个单位。从左向右输出每个水平位置的所有结点的权值之和。如图所示,从左到右的三个位置的权和分别为7,11,3。按照递归(先序)方式输入,用-1表示空树。
样例输入
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
样例输出
Case 1:
7 11 3
Case 2:
9 7 21 15
题记
让求每一个水平位置的权值的和,可以用数组存储每一列的权值之和
代码如下
#include <iostream>
#include <cstring>
using namespace std;
const int maxn=128;
int sum[maxn];
void build(int p){ //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;
memset(sum,0,sizeof (sum));
int pos=maxn/2; //树根的水平位置
sum[pos]=v; //为什么不直接用build(pos)而要把树根单独提出来呢?这样不是增加了代码量吗?
//这样做是为了判断这是不是一棵完完整整的空树,这和11行的是不一样的
build(pos-1);
build(pos+1);
}
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++];
cout<<endl<<endl;
}
return 0;
}