zoukankan      html  css  js  c++  java
  • 二叉树——UVA122

    二叉树的层次遍历

    #include <iostream>
    #include <string>
    #include <queue>
    #include <cstdio>
    #include <vector>
    #include <cstring>
    using namespace std;
    
    
    
    struct Node{
        bool have_value;
        int v;
        struct Node* left,*right;
        Node():have_value(false),left(NULL),right(NULL){}
    };
    const int maxn = 256;
    bool failed;
    char s[10000];
    
    Node *root = NULL;
    
    
    Node* newnode(){
        return new Node();
    }
    
    
    void addnode(int v,char *s){
        int n = strlen(s);
        Node* u = root;
        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 = v;
        u ->have_value = 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;
    }
    
    
    
    bool read(){
        failed = false;
        root = newnode();
        for(;;){
            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;
    }
    
    void remove_tree(Node *u){
        if(u == NULL) return ;
        remove_tree(u->left);
        remove_tree(u->right);
        delete u;
    }
    
    int main(){
        //freopen("in.txt","r",stdin);
        char s[maxn];
        while(1){
            if(!read()) break;
            vector<int>ans;
            if(!failed && bfs(ans)){
                int len = ans.size();
                for(int i = 0;i < len;i++)
                    printf("%d%c",ans[i],i == len-1?'
    ':' ');
            }else printf("not complete
    ");
        }
    
        remove_tree(root);
        return 0;
    }
    

    参考资料:
    [1].《算法竞赛入门经典(第二版)》
    [2].http://blog.csdn.net/u014800748/article/details/44733017

  • 相关阅读:
    zznuoj 2173 春天的英雄梦
    zznuoj 2171: 春天的致富梦
    zznuoj 2169: 春天的打水梦
    zznuoj 2168 大家好 我是水题
    西安赛打铁队检讨书
    B-number HDU
    Bomb HDU
    CodeForces
    1140
    Frequent Subsets Problem
  • 原文地址:https://www.cnblogs.com/sean10/p/4986518.html
Copyright © 2011-2022 走看看