zoukankan      html  css  js  c++  java
  • 【紫书】Trees on the level UVA

    题意:给你一些字符串,代表某个值被插入树中的位置。让你输出层序遍历。

    题解:动态建树。

       由于输入复杂,将输入封装成read_input。注意输入函数返回的情况

       再将申请新节点封装成newnode().

       最后层序输出直接用bfs实现。

    坑:我把ans.clear放到主程序的if里面,导致某特定情况无法初始化,wa了一页//以后debug真的别XJB改细节了上下语句顺序,一些无关紧要的处理,改之前想一想

    #define _CRT_SECURE_NO_WARNINGS
    #include "stdio.h"
    #include<stdio.h>
    #include<algorithm>
    #include<string>
    #include<vector>
    #include<list>
    #include<set>
    #include<iostream>
    #include<string.h>
    #include<queue>
    using namespace std;
    const int maxn = 300;
    char s[maxn];
    int failed;
    struct node {
        int v;
        bool have_v;
        node* leftson, *rightson;
        node() :have_v(false), leftson(NULL), rightson(NULL) {}
    }*root;
    node* newnode() { return new node(); }
    void addnode(int v, char *s) {
        int n = strlen(s);
        node * now = root;
    
        for (int i = 0; i < n - 1; i++) {
            if (s[i] == 'L') {
    
                if (now->leftson == NULL) now->leftson = newnode();
                now = now->leftson;
            }
            else {
                if (now->rightson == NULL) now->rightson = newnode();
                now = now->rightson;
            }
    
        }
        if (now->have_v) { failed = 1; }
        now->v = v;
        now->have_v = 1;
    }
    bool read_input() {
        failed = false; root = newnode();
        while (1) {
            while (scanf("%s", &s) != 1)return false;
            if (s[1] == ')')break;
            int v;
            sscanf(&s[1], "%d", &v);
            addnode(v, strchr(s, ',') + 1);
        }
        return true;
    }
    list<int>ans;
    void bfs() {
        ans.clear();
        queue<node> Q;
        node now;
        //int vis[maxn];
        Q.push(*root);
        while (!Q.empty()) {
            now = Q.front(); if (!now.have_v) { failed = 1; break; }
            Q.pop();
            if (now.leftson != NULL)Q.push(*now.leftson);
            if (now.rightson != NULL)Q.push(*now.rightson);
            ans.push_back(now.v);
        }
    
    }
    int main() {
        while (read_input()) {
            bfs();
            if (failed)cout << "not complete" ;
            else
            {
                cout << ans.front(); ans.pop_front();
                for (auto t : ans)cout << ' ' << t;
            }
            cout << endl;
        }
    
        system("pause");
    }
    成功的路并不拥挤,因为大部分人都在颓(笑)
  • 相关阅读:
    webpack基本使用笔记
    gulp学习记录
    页面优化
    linux下使用indent整理代码
    C++中的getline()
    Sum of Two Integers
    TwoSum
    IDEA个人常用快捷键总结
    mysql数据库遇到的各种问题
    Python中*args 和**kwargs的用法和区别
  • 原文地址:https://www.cnblogs.com/SuuT/p/8808367.html
Copyright © 2011-2022 走看看