Uva699 The Falling Leaves(二叉树与递归)
题解:给你一个先序二叉树,其中左子结点在父节点左一个单位,右节点在父节点右一个单位;让从左到右输出每个水平位置的权值和;本来用的从1开始root<<1建树,发现思路行不通;因为每个节点的root不同,所以考虑到从MAXN/2开始,-1,+1进行建树不就可以了么,每次如果不等于-1,就加上权值,然后找到左边最小的root,右边最大的root输出答案即可;
#include <iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> using namespace std; const int maxn=100010; int tree[maxn]; int flag,cnt; int l,r; void solve(int root) { int x;cin>>x; if(!cnt&&x==-1) {flag=0;return;} cnt=1; if(x!=-1) { l=min(l,root); r=max(r,root); tree[root]+=x; solve(root-1);solve(root+1); } } int main(){ int kase=0; while(true){ flag=1; memset(tree,0,sizeof(tree)); l=r=maxn/2; cnt=0; solve(maxn/2); if(!flag)break; printf("Case %d:\n",++kase); for(int i=l;i<=r;i++){ if(i!=l)printf(" ");printf("%d",tree[i]); } puts("\n"); } return 0; }