题意:
按先序方式输入一棵二叉树,节点是带权的,左孩子在父节点的左一个单位,右孩子在父节点的右一个单位,从左到右输出相同水平位置节点之和。
分析:
做了好几道二叉树的题,代码应该也很好理解了。这里maxn开始设了200、500都RE,后来索性开了2000,AC了
紫书上面init函数最后应该加一句 return true;
//#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; const int maxn = ;
int sum[maxn]; void build(int p)
{
int v;
scanf("%d", &v);
if(v == -) return;
sum[p] += v;
build(p - );
build(p + );
} bool Init()
{
int v;
scanf("%d", &v);
if(v == -) return false;
memset(sum, , sizeof(sum));
int pos = maxn / ;
sum[pos] = v;
build(pos - );
build(pos + );
return true;
} int main(void)
{
#ifdef LOCAL
freopen("699in.txt", "r", stdin);
#endif int kase = ;
while(Init())
{
int p = ;
while(sum[p] == ) p++;
//if(kase > 1) printf("\n");
printf("Case %d:\n%d", kase++, sum[p++]);
while(sum[p] != ) printf(" %d", sum[p++]);
printf("\n\n");
} return ;
}
代码君