您的位置:首页 > 其它

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

2014-05-19 10:46 337 查看


算法竞赛入门经典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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: