算法竞赛入门经典6.3.2层次遍历

来源:互联网 发布:电脑怎么连接本地网络 编辑:程序博客网 时间:2024/06/08 02:50

算法竞赛入门经典6.3.2层次遍历

输入一颗二叉树,你的任务是按从上到下,从左到右的顺序输出各个节点的值。每个节点都按照从根节点到它的移动序列给出(L表示左,R表示右)。在输入中,每个节点的左括号之间没有空格,相邻节点之间用一个空格隔开。每棵树的输入用一对空括号()结束(这对括号本身不代表一个结点),如图所示。

                                                                                      5

                                                                           4                     8

                                                                    11                   13            4

                                                               7        2                                     1

注意,如果从根到某个叶节点的路径上有的结点没有再输入中给出,或者给出了超过一次,应当输出-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>
using namespace std;
const int MAXN=256;
char s[MAXN+10];
int n,ans[MAXN];
int failed;
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);
 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;
}

void remove_tree(Node* u)
{
 if(u==NULL)
  return;
 remove_tree(u->left);
 remove_tree(u->right);
 free(u);
}

int read_input()
{
 failed=0;
 remove_tree(root);
 root=newnode();
 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 bfs()
{
 int front=0;
 int 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 main()
{
 read_input();
 bfs();
 if(failed==1)
  cout<<"-1"<<endl;
 else
  for(int i=0;i<n;++i)
   cout<<ans[i]<<" ";
 system("pause");
 return 0;
}

0 0
原创粉丝点击