运行效果图 结构体指针实现
#include<stdio.h> #include<stdlib.h> #include<string.h> #define N 10000 int failed,n,v,ans[N]; char s[N];//保存读入结点 typedef struct Node//结点类型 { int flag;//是否被赋值过 int number;//结点值 struct Node *left,*right;//左右子结点 }Node; Node *root,*q[N]; Node* newnode() { Node *u; u = (Node*)malloc(sizeof(Node)); if(u!=NULL) { u->flag = 0; u->left = u->right = NULL;//初始时没有左右儿子 } return u; } int addnode(int v,char *str) { int l = strlen(str); Node *u = root; for(int i = 0; i < l; i ++)//根结点开始往下走 { if(str[i] == ‘L‘) { if(u->left == NULL) u->left = newnode();//结点不存在,建立新结点 u = u->left ;//往左走 } else if(str[i] == ‘R‘) { if(u->right == NULL) u->right = newnode(); u = u->right ; } } if(u->flag)//如果最后结束的括号也被标记为用过了,说明输入有误 failed = 1; u->number = v; u->flag = 1;//标记为已经用过 return 1; } void read_input() { root = newnode();//创建根结点 failed = 0;//记录输入是否有误 while(scanf("%s",s),strcmp(s,"()")!=0) { sscanf(&s[1],"%d",&v);//读入结点值 addnode(v,strchr(s,‘,‘)+1);//查找逗号,然后插入结点 } return ; } int bfs() { int front = 0,rear = 1,v; q[0] = root;//初始时只有一个根结点 n = 0; while(front < rear) { Node* u = q[front++]; if(!u->flag) return 0;//有结点没有被赋值过,表明输入有误 ans[n++] = u->number ;//增加到输出序列尾部 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\n"); else { for(int i = 0; i < n-1; i ++) printf("%d ",ans[i]); printf("%d\n",ans[n-1]); } return 0; }
时间: 2024-10-24 11:21:19