思路:由于是通过递归的方式输入,于是编写一个递归过程进行输入比较好。(思路,题目图片取自紫书)
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<sstream>
using namespace std;
int ans[2000];
void build(int p){//建立树根水平为p的子树
int v;
cin>>v;
if(v==-1) return; //为空树
ans[p] += v;
build(p-1);build(p+1);//依次拓展左结点和右结点
}
bool input(){
int v;
cin>>v;
if(v==-1) return false; //结束全部输入
memset(ans, 0, sizeof(ans));
int p = 1000; //设定初始水平位置
ans[p]=v;
build(p-1);build(p+1);//依次拓展左结点和右结点
return true; //结束该组输入
}
int main(){
int tot=0;
while(input()){
int p = 0;
while(ans[p]==0) p++; //找到最左边的结点
printf("Case %d:\n%d",++tot,ans[p++]);
while (ans[p]!=0) printf(" %d",ans[p++]);
cout<<endl<<endl;
}
return 0;
}