题目:输入一棵二叉树,按照从上到下,从左到右的顺序输出该二叉树。
相邻节点之间用一个空格隔开,每棵树的输入用一对空括号()结束。
注意:如果从根到某个节点的路径上有的节点没有在输入中给出,或者给出超过一次,应当输出-1.节点个数不超过256
样例输入:
(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
(3,L) (4,R) ()
样例输出:
5 4 8 11 13 4 7 2 1
-1
本题是UVA122原题,有需要的可以去UVA查看。
#include<cstdio>
#include<cstring>
int check(int i,int *t){
while(i!=1){
i/=2;
if(t[i]==0)
return 1;
}
return 0;
}
int main()
{
char s[7];
int t[300];
int i,flag,f,count=0;
memset(t,0,sizeof(t));
while(1){
scanf("%s",s);
if(s[0]=='('&&s[1]==')')
break;
int x=0;
i=1;
while(s[i]!=',')
x=x*10+s[i++]-'0';
f=1;
flag=0;
if(s[++i]==')'){
if(t[1]==0)
t[1]=x;
else
flag=1;
}
while(s[i]!=')'){
if(s[i++]=='L')
f=f*2;
else
f=f*2+1;
}
if(t[f]!=0&&f!=1)
flag=1;
if(flag)break;
t[f]=x;
count=f>count?f:count;
}
if(!t[1])flag=1;
for(i=1;i<=count;i++){
if(t[2*i]==0&&t[2*i+1]==0&&t[i]!=0)
flag=check(i,t);
if(flag)break;
}
if(!flag){
for(i=1;i<=count;i++){
if(t[i]!=0)
printf("%d ",t[i]);
}
printf("\n");
}
else
printf("-1\n");
return 0;
}