UVa122-Trees on the level

UVa122-Trees on the level

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 }

 

posted @ 2018-10-28 16:42 记得每天写代码 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值