//做这题的时候真是把我纠结死,最后发现是《算法竞赛入门经典》的作者的代码有问题,特别是sscanf(&s[1],"%d",&x);addnode(v,strchr(s,',')+1);这2个语句不能直接读取"11,LL)"以及"LL)",而是把整个接受到的字符串都读取了,最后我对AddNode()做了递归运算才解决了这个问题。
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
#define MAXN 256
char s[MAXN+10];
int failed=0;
int n=0,ans[MAXN];
typedef struct TNode
{
int Have_Value;
int v;
struct TNode *Left,*Right;
}Node;
Node* root;
Node* NewNode()
{
Node* u=(Node*)malloc(sizeof(Node));
if(u!=NULL)
{
u->Have_Value=0;
u->Left=u->Right=NULL;
}
return u;
}
void AddNode(int v,char* s)
{
int n=strlen(s);
int i;
Node* u=root;
for(i=0;i<n;i++)
{
if('('==s[i])
{
break;
}
if('L'==s[i])
{
if(NULL==u->Left)
{
u->Left=NewNode();
}
u=u->Left;
}
else if('R'==s[i])
{
if(NULL==u->Right)
{
u->Right=NewNode();
}
u=u->Right;
}
}
if(u->Have_Value)
{
failed=1;
return;
}
u->v=v;
u->Have_Value=1;
if(('('==s[i])&&(strcmp(&s[i],"()")!=0))
{
sscanf(&s[i+1],"%d",&v);
}
else
{
return;
}
AddNode(v,strchr(&s[i],',')+1);
}
void RemoveTree(Node* u)
{
if(NULL==u)
{
return;
}
RemoveTree(u->Left);
RemoveTree(u->Right);
free(u);
}
int BFS()
{
int front=0,rear=1;
Node* q[MAXN];
q[0]=root;
while(front<rear)
{
Node* u=q[front++];
if(!u->Have_Value)
{
return 0;
}
ans[n++]=u->v;
if(u->Left!=NULL)
{
q[rear++]=u->Left;
}
if(u->Right!=NULL)
{
q[rear++]=u->Right;
}
}
return 1;
}
int Read_Input()
{
root=NewNode();
while(1==scanf("%s",s))
{
failed=0;
if(!strcmp(s,"()"))
{
break;
}
int v;
if((s[1]>='0')&&(s[1]<='9'))
{
sscanf(&s[1],"%d",&v);
}
else
{
break;
}
AddNode(v,strchr(s,',')+1);
if(failed)
{
return 0;
}
}
return 1;
}
int main()
{
Read_Input();
BFS();
RemoveTree(root);
for(int i=0;i<n;i++)
{
printf("%d ",ans[i]);
}
printf("\n");
if(failed)
{
printf("-1");
}
printf("\n");
}