zoukankan      html  css  js  c++  java
  • UVA 122 Trees on the level 二叉树的层序遍历

      题目链接: UVA 122

      题目描述: 输入数值和路径, 输出一棵树的层序遍历, 如果树不合法就输出-1

      解题思路: 纯码力, 学会了利用sscanf来赋值, 还有就是记住可以把任意“指向字符的指针”看成是字符串, 收获很大

      代码: 

    #include <iostream>
    #include <queue>
    #include <string>
    #include <vector>
    #include <algorithm>
    #include <list>
    #include <iterator>
    #include <cmath>
    #include <cstring>
    #include <forward_list>
    using namespace std;
    
    const int maxn = 1000+10;
    
    struct Node {
        int v;
        bool have_value;
        Node * left;
        Node * right;
        Node() {
            left = right = NULL;
            have_value = false;
            v = 0;
        }
    }node[maxn];
    Node * root;
    bool failed;
    
    Node * newnode() {
        return new Node();
    }
    
    void addnode(int value, char * s) {
        Node * u = root;
        int n = (int)strlen(s);
        for(int i = 0; i < n; 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) failed = true;
        u->v = value;
        u->have_value = true;
    }    
    
    bool read_input() {
        failed = false;
        root = newnode();
        char s[10];
        while(1) {
            if(scanf("%s", s)!=1) return false;
            if(!strcmp(s,"()")) break;
            int v;
            sscanf(&s[1], "%d", &v);
            addnode(v, strchr(s,',')+1);        
        }    
        return true;
    }
    
    bool bfs(vector<int> & ans) {
        queue<Node *> q;
        ans.clear();
        q.push(root);
        while(!q.empty()) {
            Node * u = q.front();
            q.pop();
            if(!u->have_value) return false;
            ans.push_back(u->v);
            if(u->left!=NULL) q.push(u->left);
            if(u->right!=NULL) q.push(u->right);
        }
        return true;
    }
    
    int main() {
        while(read_input()) {
            if(failed == true) {
                printf("-1
    ");
                continue;
            }
            vector<int> ans;
            if(bfs(ans)==false) {
                printf("-1
    ");
                continue;
            }    
            else {
                for(auto i : ans) {
                    cout << i << " ";
                }
                cout << endl;
            }
        }    
        return 0;    
    }
    View Code

      思考: 自己的代码能力还是差, 昨天的CF还没有补题吧孩子, 然后就是好好搞ACM吧, 这个东西对自己以后肯定是有好处的啊

  • 相关阅读:
    python中F/f表达式优于format()表达式
    java8新特性-foreach&lambda
    Java实现多线程的四种方式
    Java中的字符串常量池,栈和堆的概念
    java对象只有值传递,为什么?
    面向对象和面向过程程序设计理解及区别
    String对象为什么不可变
    mybatis_plus插件——生成器
    基于grpc的流式方式实现双向通讯(python)
    Django使用DataTables插件总结
  • 原文地址:https://www.cnblogs.com/FriskyPuppy/p/7931729.html
Copyright © 2011-2022 走看看