题目描述

输入
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;
}

本文介绍了一种使用二叉树结构和前序遍历思想来计算同一竖直线上节点值之和的方法,并通过递归构建树形结构,最终实现了从左到右遍历输出这些节点和的功能。
536

被折叠的 条评论
为什么被折叠?



