说说:
这道题非常简单,本质上就是二叉树的先序遍历。只需要建立一个数组,然后将初始位置放在数组中心。然后进入左子树的根节点,向数组左侧移动一位,添加当前节点所含的值,同理进入右子树的根节点,向数组右侧移动一位,添加当前节点所含的值。并标记好到达过的数组的左右边界,最后将边界内数组的值输出即可。
源代码:
#include <stdio.h>
#include <string.h>
#define MAXN 200
int piles[MAXN];
int leftmost,rightmost;
void tree(int pos);
int main(){
int val,T=1,i,mid;
char c;
//freopen("data","r",stdin);
while(1){
scanf("%d%c",&val,&c);
if(val==-1&&c==' '){//空树,但并未结束
while(scanf("%d%c",&val,&c)&&c!='\n');
continue;
}
else if(val==-1)//测试结束
break;
memset(piles,0,sizeof(piles));
leftmost=rightmost=mid=100;//从数组的中间开始
piles[mid]=val;
tree(mid-1);//遍历左子树
tree(mid+1);
printf("Case %d:\n",T++);
for(i=leftmost;i<=rightmost;i++)
printf("%d%c",piles[i],i==rightmost?'\n':' ');
putchar('\n');
}
return 0;
}
void tree(int pos){
int val;
scanf("%d",&val);
if(val==-1)
return;
else{
piles[pos]+=val;
leftmost=pos<leftmost?pos:leftmost;//更新左边界
rightmost=pos>rightmost?pos:rightmost;
}
tree(pos-1);
tree(pos+1);
return ;
}原文地址:http://blog.csdn.net/u011915301/article/details/39161089