• 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?'
    ':' ');
    74                 }
    75                 else{
    76                         printf("not complete
    ");
    77                 }
    78         }
    79         return 0;
    80 }
  • 相关阅读:
    freak out用法
    kinda用法
    比较级与最高级
    issue用法
    invite用法
    yet用法
    follow用法
    get用法
    turn up&turn off&turn on用法
    关于document.lastModified属性
  • 原文地址:https://www.cnblogs.com/bo2000/p/9827615.html
Copyright © 2020-2023  润新知