题意:有一棵二叉树,每个节点都有一个水平位置,左子节点在它左边一个单位,右子节点在右边一个单位,从左向右输出每个水平位置的所有节点之和。
分析:不用建树,可以直接遍历。用一个100的数组,正中间是根的位置,往左就减1,往右就加1,把落叶数加上去,模仿dfs,去遍历一遍,在把数组不是0的输出。
代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int a[100],left,right; void solve(int v,int pos) { int x,y; if(v!=-1) { if(pos<left) left=pos; if(pos>right) right=pos; a[pos]+=v; scanf("%d",&x); //左 solve(x,pos-1); scanf("%d",&y); //右 solve(y,pos+1); } } int main() { int n,k=1; while(~scanf("%d",&n)&&n!=-1) { memset(a,0,sizeof(a)); left=right=50; solve(n,50); printf("Case %d:\n",k++); for(int i=left;i<right;i++) printf("%d ",a[i]); printf("%d\n\n",a[right]); } }