6.3.2 层次遍历

来源:互联网 发布:查理大学 知乎 编辑:程序博客网 时间:2024/05/16 07:51
#include<cstdio>#include<cstring>#include<cstdlib>#define MAX 256char s[MAX + 10];int failed;int n = 0, ans[MAX];typedef struct Node{int have_value;int v;struct Node *left, *right;} Node;Node *root;Node* newnode(){Node* u = (Node*)malloc(sizeof(Node));if(u != NULL){u->left = u->right = NULL;u->have_value = 0;}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, rear = 1;Node* q[MAX];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(){if(read_input()){n = 0;if(bfs()){for(int i = 0; i < n-1; i++)printf("%d ",ans[i]);printf("%d\n",ans[n-1]);}elseprintf("-1\n");}return 0;}