最近自己也在学数据结构与算法,没错能看出来,我在打紫书,废话不多说 ,写题解
题意:给出一个二叉树的结构,然后需要通过程序输出每一列值的和。
输入:按照递归(先序)方式输入。有多组输入数据。若输入数据第一个数为-1,那么输入结束。
输出:从左至右依次输出二叉树每一列的和,并用空格隔开,不同组的输出用空行隔开。
思路:既然是按照递归顺序输入的,那么就通过递归还原树。
pos为当前节点的位置,那么pos-1为左子节点的位置,pos+1为右子节点的位置。
代码:
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=100;
int ans[maxn];//存储每一列的和
bool init();
void build(int pos);
int main()
{
int count=0;
while(init())
{
int i=0;
printf("Case %d:\n",++count);
for(i;i<maxn&&ans[i]==0;i++);//找到最左边的列
printf("%d",ans[i]);
i++;
for(i;i<maxn;i++)
{
if(ans[i]==0)continue;
printf(" %d",ans[i]);
}
printf("\n\n");
}
}
void build(int pos)
{
int pv;
scanf("%d",&pv);
if(pv==-1)return ;//如果是-1,直接返回
ans[pos]+=pv;
build(pos-1);
build(pos+1);
}
bool init()
{
int root;//这是根
scanf("%d",&root);
if(root==-1)return false;
int pos=maxn/2;
//根节点设在最中间
memset(ans,0,sizeof(ans)); //归零操作
ans[pos]=root;
build(pos-1);//建立左子树
build(pos+1);//建立右子树
return true;
}
个人总结:
以前觉得递归挺难理解的,但是现在是越来越发现,递归是将大问题拆成小问题,小问题又可以拆成更小的问题,通过解决一个一个小问题,进而解决大问题。