Uva 122 Trees on the level

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Uva 122 Trees on the level相关的知识,希望对你有一定的参考价值。

题意:读入xx的数据,建立一棵二叉树,若成功建立无错误,则输出其层序遍历。

讲一下处理吧。

  首先是输入那么就是input函数。我们不停的读入一个函数,如果输入正确的话,对于一组数据而言应该是读到()为止,所以把s=="()"作为一组数据读入结束的标志,return一个true给主函数,进行该组数据的操作,但是如果输入全部结束的时候,应该是读入为空 所以return一个false给主函数。

  在读进一组数据的一个结点的内容的时候,利用sscanf(s[1],"%d",&v)读出该结点的值。再利用strchr(s,‘,‘)得到s这个字符串中第一个逗号的地址,则strchr(s,‘,‘)+1就是后面代表该结点位置的部分字符串的起始地址了。

  那么已知一个结点的值和位置,就可以添加结点了,即执行addnode(v,postion)函数了。

  首先新建一个结点指向根节点,根据代表postion的字符串s‘来不断模拟,若s’[i]==L 那么进入左子树,但是要先判断左子树是否存在,不存在则创建一个新的,再进入该左子树。右子树同理。当s‘的内容读完之后,就是到达要添加的结点的位置了,把它的权值修改为v即可。

  那么树已经建立了,接下来是层序遍历,层序遍历都是利用了队列来处理。

接下来要注意的是过程当中哪些因素使得输入为错误,而输出not complete

0.重复输入某一个结点的数据,即addnode函数中的

if(u->vis) error=true;

1.取出的结点,竟然没有被访问过。(因为每次建立结点时要记录u->vis=true,否则就说明该结点只被建立了,但是没有对应的权值,即输入出现了问题)

Node* u =q.front();q.pop();
        if(!u->vis) return false;

 

另外,注意bfs函数当中每次vector因为是全局变量所以要重新清空

vector<int>ans;
ans.clear();

 

  

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <vector>
  5 #include <queue>
  6 #include <string.h>
  7 using namespace std;
  8 const int maxn=300;
  9 bool error;
 10 vector<int>ans;
 11 char s[maxn];
 12 struct Node
 13 {
 14     bool vis;
 15     int v;//
 16     Node *left, *right;
 17     Node():vis(false),left(NULL),right(NULL){}
 18 };
 19 
 20 Node *root;
 21 Node *newnode(){return new Node();}
 22 
 23 void addnode(int v,char* s)
 24 {
 25     int  n=strlen(s);
 26     Node *u=root;
 27     for(int i=0;i<n;i++)
 28     {
 29         if(s[i]==L)
 30         {
 31             if(u->left == NULL)
 32                 u->left=newnode();
 33             u=u->left;
 34         }
 35         else if(s[i]==R)
 36         {
 37             if(u->right==NULL)
 38                 u->right=newnode();
 39             u=u->right;
 40         }
 41     }
 42 
 43         if(u->vis) error=true;
 44         u->v=v;
 45         u->vis=true;
 46 
 47 
 48 }
 49 bool input()
 50 {
 51 
 52     error=false;
 53     root=newnode();
 54     for(;;)
 55     {
 56         if(scanf("%s",s)!=1) return false;
 57         if( !strcmp(s,"()") ) break;
 58         int v;
 59         sscanf(&s[1],"%d",&v);
 60         addnode( v, strchr(s,,)+1 );
 61 
 62     }
 63     return true;
 64 }
 65 bool bfs(vector<int>& ans)
 66 {
 67     queue<Node*> q;
 68     ans.clear();
 69     q.push(root);
 70     while(!q.empty())
 71     {
 72         Node* u =q.front();q.pop();
 73         if(!u->vis) return false;//**?????
 74         ans.push_back(u->v);
 75         if(u->left != NULL)
 76             q.push(u->left);
 77         if(u->right != NULL)
 78             q.push(u->right);
 79     }
 80     return true;
 81 }
 82 void show()
 83 {
 84     int t=0;
 85     for(int i=0; i<ans.size(); i++)
 86     {
 87         if(i) printf(" ");
 88         printf("%d",ans[i]);
 89     }
 90     printf("\n");
 91     ans.clear();
 92 }
 93 int main()
 94 {
 95     while(input())
 96     {
 97         bfs(ans);
 98         if(error||!bfs(ans)) printf("not complete\n");
 99         else show();
100     }
101     return 0;
102 }
103 /*
104 (11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
105 (3,L) (4,R) ()
106 */

 

以上是关于Uva 122 Trees on the level的主要内容,如果未能解决你的问题,请参考以下文章

UVA-122(Trees on the level)

Uva 122 Trees on the level

UVA 122 -- Trees on the level (二叉树 BFS)

UVA 122 Trees on the level 二叉树 广搜

UVA 122 Trees on the level

UVa122-Trees on the level