题意:给一棵二叉树,每个节点都有一个水平位置:左儿子在它左边1个单位,右儿子在右边1个单位。从左向右输出每个水平位置的所有结点的权值之和。按照递归先序遍历输入,-1表示空树
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,date,x,y;
int Left,Right;
int a[250];
void dfs(int num,int pos)
{
if(num!=-1)
{
if (pos<Left) Left=pos;//更新最左点
if (pos>Right) Right=pos;//更新最右点
a[pos]+=num;
scanf("%d",&x);//左子树
dfs(x,pos-1);
scanf("%d",&y);//右子树
dfs(y,pos+1);
}
}
int main()
{
while(scanf("%d",&n)!=EOF&&n!=-1)
{
memset(a,0,sizeof(a));
date++;
printf("Case %d:\n",date);
Left=100;Right=100;
dfs(n,100);//100为中间
for(int i=Left;i<=Right;i++)
printf("%d ",a[i]);
printf("\n");
}
return 0;
}
在使用库,用left,right做变量时报错,所以改成了大写