描述
给一棵二叉树,每个节点都有一个水平位置:左儿子在它左边1个单位,右儿子在右边1个单位。从左向右输出每个水平位置的所有结点的权值之和。按照递归方式输入,-1表示空
树
题解
定义一个数组来记录答案。根节点对应的那条数值线节点之和存储在数组的终点。然后dfs中递归调用,递归出口是遇到空树
代码
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define maxn 10000
int res[maxn];
///这种做法通俗易懂!!!
void dfs(int val,int pos)
{
if (val == -1)
return ;
res[pos] += val;
int left,right;
scanf("%d",&left);
dfs(left,pos - 1);
scanf("%d",&right);
dfs(right,pos + 1);
return ;
}
int main ()
{
int val;
int cas = 0;
while (scanf("%d",&val) && val != -1)
{
memset(res , 0 , sizeof(res));
dfs (val , maxn/2);
printf("Case %d:\n",++cas);
int p=0;
while(res[p]==0)
p++;
cout<<res[p++];
while(res[p]!=0)
cout<<" "<<res[p++];
printf("\n\n");
}
return 0;
}