- #include<cstdio>
- #include<vector>
- #include<queue>
- #include<cstring>
- using namespace std;
- const int maxn=260;
- struct node{
- bool have_value; //判断是否被付了值
- int value; //结点值
- node*left,*right; //左右子结点
- node():have_value(false),left(NULL),right(NULL){} //构造函数
- };
- char s[maxn]; //输入字符串
- int flag=0; //判断是否多次赋值,两次以上值为1
- vector<int> vec1; //用于储存将输出的值
- node*root; //根结点
- node* newnode(){ //此函数通过new 运算符申请内存生成新的node结构体并以指针形式返回
- return new node();
- }
- void addnode(int value,char* s){ //构建树,添加结点
- int len=strlen(s);
- node*u= root;
- for(int i=0;i<len;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=1; //已经被付过值,表明输入有误
- u->value=value;
- u->have_value=true; //标记此结点已经被负过值
- }
- bool read(){
- flag=0;
- root = newnode();
- while(true){
- if(scanf("%s",s)!=1)return false; //如果读到文件结束符,返回假
- if(!strcmp(s,"()"))break;
- int value;
- sscanf(&s[1],"%d",&value); //此函数从字符串中读取指定值,用于类似于scanf();
- addnode(value,strchr(s,',')+1); //strchr位于<cstring>头文件下,返回指定字符的地址
- }
- return true;
- }
- bool bfs(vector<int> & vec){
- queue<node *>q;
- vec.clear();
- q.push(root); //初始时只有一个根结点
- while(!q.empty()){
- node *u= q.front();q.pop();
- if(!u->have_value)return false; //如果为假,表明有结点未被赋值,输入有错
- vec.push_back(u->value); //将结点值放入到vector容器中,等待输出
- if(u->left!=NULL)q.push(u->left); //如果左右子结点存在,则放入到队列中
- if(u->right !=NULL)q.push(u->right);
- }
- return true;
- }
- int main(){
- while(read()){
- bool flag1=bfs(vec1); //flag1用于判断根结点是否存在值,不存在为假
- if(flag || !flag1)printf("not complete");
- else {
- printf("%d",vec1[0]);
- for(int i=1;i<vec1.size();i++)
- printf(" %d",vec1[i]);
- }
- printf("\n");
- }
- return 0;
- }
Trees on the level 树的层次遍历 UVA 122(BFS)
最新推荐文章于 2022-01-21 19:00:31 发布