题目:
给一棵二叉树,每个结点都有一个水平位置:左子结点在它左边1个单位,右子结点在右边1个单位。从左向右输出每个水平位置的所有结点的权值之和。如图所示,从左到右的3个位置的权和分别为7,11,3。按照递归(先序)方式输入,用-1表示空树。
Sample Input
5 7 -1 6 -1 -1 3 -1 -1
8 2 9 -1 -1 6 5 -1 -1 12 -1
-1 3 7 -1 -1 -1
-1
Sample Output
Case 1:
7 11 3
Case 2:
9 7 21 15
分析与解答
1.把树根放在数组中间下标处
2.不断递归调用,左边右边子树,输入结点的值,改变下标对应的数值
3.遍历数组,从左往右输出值即可
4.dfs递归思想:类似于
https://blog.csdn.net/qq_40828914/article/details/81279356
先序的根左右都是这么调用
#include<iostream>
using namespace std;const int maxn = 200;
int sum[maxn];void bulid(int p){int v;cin>>v;if(v==-1) return ;sum[p]+=v;build(p-1);build(p+1);
}bool init(){int v;cin>>v;if(v==-1) return false;memset(sum,0,sizeof(sum));int pos=maxn/2;sum[pos]=v;bulid(pos-1);build(pos+1);
}int main(){int kase=0;while(init()){int p=0;while(sum[p]==0) p++;cout<<"Case "<<++kase<<":\n"<<sum[p++];while(sum[p]!=0) cout<<" "<<sum[p++];cout<<"\n\n";}return 0;
}