码迷,mamicode.com
首页 > 其他好文 > 详细

UVa122-Trees on the level

时间:2018-10-28 17:51:17      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:++   eve   tar   设计   col   输入   表示   \n   char   

1.题目描述:点击链接

2.问题分析:

简单地来说,就是输入一组字符串,表示二叉树上某些节点的值和位置,这些节点不一定可以组成一颗完整的二叉树,可能出现缺少某个节点或者某个节点冗余的情况。

需要我们进行判断是否能组成一颗完整的二叉树,若可以按照由上到下,由左到右的顺序输出每个节点的值,若不能则输出not complete

3.输入数据分析:

题目上给出节点的个数不超过256个,如果按照最坏的情况去考虑,256个节点组成一条单链,那么最后一个节点的编号会非常大,所以不能用暴力去解决。

4.算法设计:

由于节点的不确定,最好构建一个二叉树,然后往树里添加新的节点,最后使用bfs查找是否存在缺少或者多余的情况。

5.代码:

 1 #include<iostream>
 2 #include<vector>
 3 #include<stdio.h>
 4 #include<stdlib.h>
 5 #include<cstring>
 6 #include<queue>
 7 #include<string.h>
 8 using namespace std;
 9 const int maxn=256+10;
10 char s[maxn];
11 bool failed;
12 struct Node{
13     int v;
14     bool have_value;
15     Node *left,*right;
16     Node():have_value(false),left(NULL),right(NULL){}
17 };
18 Node *root;
19 Node *newnode(){return new Node();}
20 void addnode(int v,char *s){
21     int n=strlen(s);
22     Node *u=root;
23     for(int i=0;i<n;i++)
24     {
25         if(s[i]==L){
26             if(u->left==NULL)u->left=newnode();
27             u=u->left;
28         }
29         else if(s[i]==R){
30             if(u->right==NULL)u->right=newnode();
31             u=u->right;
32         }
33     }
34     if(u->have_value==1) failed=true;
35     u->have_value=1;
36     u->v=v;
37 }
38 bool read_input(){
39     failed=false;
40     root=newnode();
41     for(;;){
42         if(scanf("%s",s)==EOF)return false;
43         if(strcmp(s,"()")==0)break;
44         int v;
45         sscanf(&s[1],"%d",&v);
46         addnode(v,strchr(s,,)+1);
47     }
48     return true;
49 }
50 bool bfs(vector<int>&ans){
51     queue<Node*>q;
52     ans.clear();
53     q.push(root);
54     while(!q.empty()){
55         Node* u=q.front();q.pop();
56         if(!u->have_value)return false;
57         ans.push_back(u->v);
58         if(u->left!=NULL)q.push(u->left);
59         if(u->right!=NULL)q.push(u->right);
60     }
61     return true;
62 }
63 int main()
64 {
65         freopen("in.txt","r",stdin);
66         while(1)
67         {
68                 if(read_input()==0)break;
69                 vector<int>ans;
70                 if(!failed&&bfs(ans)){
71                     int n=ans.size();
72                     for(int i=0;i<n;i++)
73                             printf("%d%c",ans[i],i==n-1?\n: );
74                 }
75                 else{
76                         printf("not complete\n");
77                 }
78         }
79         return 0;
80 }

 

UVa122-Trees on the level

标签:++   eve   tar   设计   col   输入   表示   \n   char   

原文地址:https://www.cnblogs.com/bo2000/p/9827615.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!