二叉树的递归遍历 The Falling Leaves UVa 699

题意:对于每一棵树,每一个结点都有它的水平位置,左子结点在根节点的水平位置-1,右子节点在根节点的位置+1,从左至右输出每个水平位置的节点之和

解题思路:由于上题所示的遍历方式如同二叉树的前序遍历,与天平那题不同,本题不需要构造出完整的结点左右子树,只需要构造出结点的相对位置,每次输入一个结点树,若为-1,则返回,否则依次递归执行input(p-1)与input(p+1)。

代码如下:

 1 #include<stdio.h>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 const int MAXX=260000;
 6 int sum[MAXX];
 7 void input(int p){
 8     int root;
 9     scanf("%d",&root);
10     if(root==-1)  return;
11     sum[p]+=root;
12     input(p-1);
13     input(p+1);
14 }
15 
16 bool init(){
17     int root;
18     scanf("%d",&root);
19     if(root==-1)    return false;
20     int d;
21     memset(sum,0,sizeof(sum));
22     d=MAXX/2;
23     sum[d]=root;
24     input(d-1);
25     input(d+1);
26 }
27 
28 int main(){
29     freopen("in.txt","r",stdin);
30     int i=1;
31     while(init()){
32         printf("Case %d:
",i);
33         int num=0;
34         while(sum[num]==0){
35             num++;
36         }
37         while(sum[num]!=0){
38             printf("%d%c",sum[num],sum[num+1]?' ':'

 ');
39             num++;
40         }
41         cout<<endl;
42         i++;
43     }
44 }
原文地址:https://www.cnblogs.com/muziqiu/p/7243253.html