题目见刘汝佳101,闲来无事自己敲敲,很好的模板
#define maxn 300
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct node
{
int hav;//是否访问了
int v;//结点值
node *left,*right;//左右儿子
};
char s[maxn];node *q[maxn];
node *new_node()
{
node* u=(node*)malloc(sizeof(node));
if(u!=NULL)
{
u->hav=0;//初始状态没访问
u->left=NULL;
u->right=NULL;
}
return u;
}
node *root=new_node();int failed;
void addnode(int v,char* s){
int n=strlen(s);
node *u=root;
for(int i=0;i<n;i++)
{
if(s[i]=='L')
{
if(u->left==NULL)u->left=new_node();
u=u->left;
}
if(s[i]=='R')
{
if(u->right==NULL)u->right=new_node();
u=u->right;
}
}
if(u->hav)failed=1;//访问一次以上就失败了
u->v=v;u->hav=1;//赋值,标记已访问
}
int input(){
failed=0;
for(;;){
if(scanf("%s",s)!=1)return 0;//整个输入结束
if(!strcmp(s,"()"))break;
int v;sscanf(&s[1],"%d",&v);
addnode(v,strchr(s,',')+1);
}
return 1;
}
int n,ans[maxn];
int bfs(){
int front=0,rear=1;
q[0]=root;
while(front<rear)
{
node *u=q[front++];
if(!u->hav)return 0;//节点路径未给出
ans[n++]=u->v;//按二叉树的顺序把结点值存入数组
if(u->left!=NULL)q[rear++]=u->left;
if(u->right!=NULL)q[rear++]=u->right;
}
return 1;//成功
}
void del_root(node*u)
{
if(u==NULL)return;
del_root(u->left);//递归释放左子树
del_root(u->right);//递归释放右子树
free(u);
}
int main(){
while(input())
{
n=0;
if(failed)printf("-1\n");
else
{
if(!bfs())printf("-1\n");//有节点的路径没给出
else
for(int i=0;i<n;i++)
printf("%d%c",ans[i],i==n-1?'\n':' ');
}
del_root(root);//防止内存泄露
root=new_node();//为下一次输入构造树根
}
return 0;
}