• UVA 122 Trees on the level 二叉树 广搜


      题目链接: https://vjudge.net/problem/UVA-122

      题目描述: 给你一种二叉树的构造方法, 让你逐层输出二叉树的节点值, 如果不能够则输出"not complete"

      解题思路: 这道题就是硬搞就可以了, 参考紫书去做的, 首先处理输入就是非常麻烦的事情, 用到了sscanf就会轻松很多, 看来C中还是有很多很多的好用的标准库函数可以拿来用的, 例如还有本题中的strchr() , 处理完输入, 然后就去构造数。 然后广搜一遍即可

      代码: 

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <cstring>
    #include <iterator>
    #include <cmath>
    #include <algorithm>
    #include <stack>
    #include <deque>
    #include <map>
    #include <set>
    #include <queue>
    #define lson l, m, rt<<1
    #define rson m+1, r, rt<<1|1
    #define mem0(a) memset(a,0,sizeof(a))
    #define sca(x) scanf("%d",&x)
    #define de printf("=======
    ")
    typedef long long ll;
    using namespace std;
    
    struct node {
        bool yo;
        int value;
        node * l;
        node * r;
        node() {
            yo = false;
            value = 0;
            l = r = NULL;
        }
        
    };
    node * root;
    bool failed;
    vector<int> ans;
    int cnt;
    
    node * new_node() {
        return new node();
    }
    
    void addnode( int v, char * p ) {
        int n = (int)strlen(p);
        node * u = root;
        for( int i = 0; i < n; i++ ) {
            if( p[i] == 'L' ) {
                if( u->l == NULL ) u->l = new_node();
                u = u->l;
            }
            else if( p[i] == 'R' ) {
                if( u->r == NULL ) u->r = new_node();
                u = u->r;
            }
        }
        if( u->yo == true ) {
            failed = true;
            return;
        }
        u->value = v;
        u->yo = true;
    }
    
    bool readin() {
        char s[290];
        while( 1 ) {
            if( scanf( "%s", s ) != 1 ) return false;
            if( strcmp(s, "()") == 0 ) break;
            int v;
            sscanf( &s[1], "%d", &v );
            addnode( v, strchr(s, ',')+1 );
        }
        return true;
    }
    
    bool bfs() {
        queue<node *> q;
        q.push(root);
        while( !q.empty() ) {
            node * temp = q.front();
            q.pop();
            if( temp->yo == false ) return 0;
            ans.push_back(temp->value);
            if( temp->l ) q.push(temp->l);
            if( temp->r ) q.push(temp->r);
        }
        return 1;
    }
    int main() {
        while(1) {
            cnt = 0;
            failed = 0;
            root = new_node();
            ans.clear();
            if( !readin() ) break;
            if( !failed && bfs() ) {
                int len = (int)ans.size();
                for (int i = 0; i < len; i++)
                    printf("%d%c", ans[i], i == len - 1 ? '
    ' : ' ');
            }
            else {
                puts( "not complete" );
            }
        }
        return 0;
    }
    View Code

      思考: 了解到一些很好用函数, 然后知道了每次对指针进行操作的时候都要判空, 我觉得数据结构和数学两大块儿真的是具重要, 原本打算打完今年的区域赛就退役了,但是为了学习各种的数据结构和数学, 我还是得继续打下去啊.....刷题还是不能断啊老哥, 然后我是真的想进橘子娱乐啊........我他妈是真的想进啊, 和我实在是太适合了, 然后现在就是非常非常非常难熬了.......

  • 相关阅读:
    002使用代码和未经编译的XMAL文件创建WPF程序
    001使用代码创建WPF应用程序
    制作地图PPT
    数据库基本知识学习(sql server)
    虚拟现实技术对人类是福还是祸?
    计算机中的数学
    软件架构
    extracts
    bootstrap
    omron欧姆龙自动化应用
  • 原文地址:https://www.cnblogs.com/FriskyPuppy/p/7496562.html
Copyright © 2020-2023  润新知