这一题的题意就是说明有很多的树叶会向下飘动,问最后每一条水平线上的权值是多少。这里的水平是指,每个左孩子是在根结点的左边一个位置上,右孩子实在根节点的右边一个位置上。题目按照先序输入的方式进行。问你每次输入的数据最后按照从左到右的方式输出的数据是多少。
这一题的最难的部分应该就是如何解决每一个节点是在同一条水平线上的问题。这个其实很好办,也就是使用一个数组,将每一个输入的数字放同一个位置上。这一题和树状天平一样,都是使用递归输入,每次都把输入的数字放到下相应的数组的位置上去。其中先把第一个数字,第一个数字是属于根节点,那么先把这个数字放到这个数组的中间,这样的话就可以让剩下的数字向两边分布,这样就可以达到目的,其中使用了一个build函数,这个函数是用来处理每一颗子树上的数字的,同时还有一个是init函数,这个函数是用来进行开始的递归的,只有先把 第一个节点安放好才可以进行下一个节点的安放
源代码
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=1000;
int sum[maxn];
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;
memset(sum,0,sizeof(sum));
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++];
cout<<"\n\n";
}
return 0;
}