Problem description:
输入一颗二叉树,你的任务是按从上到下、从左到右的顺序输出各个节点的值。每个节点都按照从根节点到他的移动序列给出(L表示左,R表示右)。在输入中,每个节点的左括号和有括号之间没有空格,相邻节点之间有一个空格。每棵树的输入用括号()结束。
注意:如果从根到某个叶节点的路径上有的节点没有在输入中给出或者给出了超过一次,应当输出-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
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
using namespace std;
int failed=0;
typedef struct Tnode //typedef 声明
{
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);
Node *u=root;
for(int i=0;i<n;i++)
if(s[i]=='L')
{
if(u->left==NULL) u->left=newnode();
u=u->left;
}
else if(s[i]=='R')
{
if(u->right==NULL) u->right=newnode();
u=u->right;
}
if(u->have_value) failed=1;
u->v=v;
u->have_value=1;
}
char s[1000];
int read_input() //读入信息
{
failed=0;
root=newnode();
while(scanf("%s",s)!=EOF)
{
if(strcmp(s,"()")==0) break;
int v;
sscanf(&s[1],"%d",&v);
addnode(v,strchr(s,',')+1);
}
return 1;
}
int n=0,ans[1000]; //节点总数和输出序列
int bfs()
{
int front=0,rear=1;
Node *q[1000];
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 main()
{
read_input();
if(failed||!bfs()) printf("-1");
else
for(int i=0;i<n;i++)
printf("%d ",ans[i]);
printf("\n");
return 0;
}