二叉树的递归遍历 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:\n",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]?' ':'\n\n '); 39 num++; 40 } 41 cout<<endl; 42 i++; 43 } 44 }