632(层次遍历,广度优先搜索)

来源:互联网 发布:淘宝上买精密管判几天 编辑:程序博客网 时间:2024/05/03 12:43

输入:(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
输出:5 4 8 11 13 4 7 2 1

#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXN 300typedef struct Tnode{    int have_value,v;    struct Tnode *left,*right;}Node;Node* root;int flag=1;Node* newnode(){    Node* u=(Node*)malloc(sizeof(Node));    if(u!=NULL){        u->have_value=0;        u->left=u->right=NULL;    }    return u;}void remove_tree(Node* u){    if(u==NULL) return;    remove_tree(u->left);    remove_tree(u->right);    free(u);}void addnode(int v,char* s){    int n=strlen(s);    Node* u=root;    int i;    for(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) flag=0;//有节点被重复赋过值,表示输入错误     u->v=v;    u->have_value=1;}void read_input(){    root=newnode();                                for(;;){        char s[MAXN];//      if(scanf("%s",s)!=1) return;        scanf("%s",s);        if(!strcmp(s,"()")) break;        int v;        sscanf(&s[1],"%d",&v);        addnode(v,strchr(s,',')+1);    }}int n=0,ans[MAXN];void bfs(){    if(flag==0) return;    int front=0,rear=1;    Node* q[MAXN];//存放节点的队列     q[0]=root;    while(front<rear){        Node* u=q[front++];        if(u->have_value==0) {//有节点没被赋值过,表明输入有误             flag=0;            return;        }        ans[n++]=u->v;        if(u->left!=NULL) q[rear++]=u->left;        if(u->right!=NULL) q[rear++]=u->right;    }}int main(){    read_input();    bfs();    remove_tree(root);    if(!flag){        printf("-1\n");        return 0;    }    int i;    for(i=0;i<n;i++){        printf("%d ",ans[i]);    }    return 0; } //(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()//(3,L) (4,R) ()
0 0
原创粉丝点击