题目链接:
题目意思:
给一颗二叉树,让你按左到右的顺序,输出同一水平位置的所有节点的值的总和。
解题思路:
用递归建树,在建树的过程中就把每一水平位置上的总和求出来。在这里我把树根的位置记为150,然后左孩子的位置就为直系父亲位置减1,右孩子为直系父亲位置加1.
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<stack>
#include<queue>
#define eps 1e-6
#define INF (1<<20)
#define PI acos(-1.0)
using namespace std;
int ans[330];
void tree(int cur,int loc)
{
if(cur==-1) //遇到叶子节点,则返回
return ;
ans[loc]+=cur; //否则在该位置上加上该值
int left,right;
scanf("%d",&left);
tree(left,loc-1); //左孩子,位置为父亲的位置减1
scanf("%d",&right);
tree(right,loc+1); //右孩子,位置为父亲的位置加1
return ;
}
int main()
{
int cur,ca=0;
while(scanf("%d",&cur)&&cur!=-1)
{
memset(ans,0,sizeof(ans));
tree(cur,150); //将150置为初始位置
int i;
for(i=1;i<=300;i++) //去掉前面的0
if(ans[i])
break;
if(i==301)
continue;
printf("Case %d:\n%d",++ca,ans[i]);
for(++i;i<=300;i++) //输出不为0的和值
if(ans[i])
printf(" %d",ans[i]);
printf("\n\n");
}
return 0;
}