• 树的层次遍历(Trees on the level,UVA 122)


    题目描述:

    题目思路:

    1.用结构链表来建树

    2.用队列来实现层次遍历,当遍历到根节点时,将其子节点压入队列

    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <vector>
    #include <queue>
    using namespace std;
    
    //树结点 
    struct Node{
        int v ;
        Node* left,*right ;
        int have_value ;
        Node():have_value(false),left(NULL),right(NULL){} ;
    } ;
    
    Node* root ;//根节点
    
    Node* newnode(){
        return new Node() ; //返回一个新结点 
    } 
    
    bool failed ;
    
    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; 
    } 
    
    void freetree(Node* u){ //释放内存 
        if(u == NULL) return ;
        freetree(u->left);
        freetree(u->right);
        delete u;
    }
    
    char s[1005];
    bool read_input(){
        failed = false ;
        freetree(root) ;
        root = newnode();
        while(true){
            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(int argc, char *argv[])
    {
        vector<int> ans;
        while(read_input()){
            if(!bfs(ans)) failed = 1;
            if(failed) printf("not complete
    ");
            else{
                for(int i = 0;i < ans.size();i++)
                {
                    if(i != 0) cout << " " ;
                       cout << ans[i];
                }
                cout << endl ;
            }    
        }
        return 0;
    }
  • 相关阅读:
    根据系统的pid查询sql语句
    DORADO实现动态拼装查询条件
    一个Spring的配置管理接口
    MS SQL Server Management Studio连接到SQL Server命名实例的方法
    WSDL学习笔记
    显示MyBatis/Ibatis的SQL语句
    测试代码显示
    C#中一个项目中无法引用另外一个项目中的类的问题
    Learn How To Use LogMiner(Practice)
    WIN2003 IIS6 FastCGI php5.33配置重点
  • 原文地址:https://www.cnblogs.com/secoding/p/9532537.html
Copyright © 2020-2023  润新知