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("=======\n")
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 ? '\n' : ' ');
        }
        else {
            puts( "not complete" );
        }
    }
    return 0;
}
View Code

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

posted on 2017-09-08 21:49  FriskyPuppy  阅读(179)  评论(0编辑  收藏  举报

导航