题目描述
输入
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
输出
Case 1: 7 11 3 Case 2: 9 7 21 15
思路:二叉树+模拟 利用前序遍历的思想进行递归,存储同一竖直线上的结点的编号之和.最后从左到右遍历输出即可,要注意UVA那坑输出.
参考代码
#include<bits/stdc++.h> using namespace std; const int maxn = 10000+5; int arr[maxn],case1; void build(int p)//构建树 { int v; cin>>v; if(v==-1){ return; } arr[p]+=v; build(p-1);//模拟左子树 build(p+1);//模拟右子树 } bool init(){ int v,pos; cin>>v; if(v==-1){ return 0; } memset(arr,0,sizeof(arr)); pos = maxn / 2;//从中间开始进行编码计数. 因为最后求得是同一竖直线上的结点编号之和. arr[pos] = v; build(pos-1); build(pos+1); return 1; } int main() { while(init()) { int p = 0; while(!arr[p]) p++; cout<<"Case "<<++case1<<":"<<endl<<arr[p++]; //cout<<"-------------------------"<<endl; while(arr[p]){ cout<<" "<<arr[p]; p++; } cout<<endl<<endl; } return 0; }