题目大意:一颗二叉树的先序遍历,输出竖着数的数值和。从根开始,左子树的有子树与跟同一竖,-1代表空。
解题思路:数组模拟先序遍历建树,先序遍历都是左左左到完,所以,dfs建树。如果-1则返回,看的完全是小紫的代码,感觉写得很好看。刚开始,想dfs判断先序遍历后的树完整与否,不完整就继续输入,完整时,根据先序遍历建树,而用一个map函数,dfs建树。从根左子树就-1,右子树就+1,然后输出map。然后不会...就放弃了。
ac代码:
#include <iostream>
#include <cstring>
using namespace std;
int sum[5005];
void built(int n)
{
int data;
cin >> data;
if (data == -1)
return ;
sum[n] += data;
built(n-1), built(n+1);
}
bool init()
{
int data;
cin >> data;
if (data == -1)
return 0;
memset(sum, 0, sizeof(sum));
sum[5005/2] = data;
built(5005/2-1), built(5005/2+1);
return 1;
}
int main()
{
int i, count=1;
while (init()){
i = 0;
while (sum[i] == 0)
i++;
printf("Case %d:\n", count++);
printf("%d", sum[i++]);
while (sum[i] != 0)
printf(" %d", sum[i++]);
printf("\n\n");
}
return 0;
}