• 第六章例题二叉树层次遍历


    1.指针实现

    #include <iostream>
    #include <vector>
    #include <queue>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    #define maxn 100
    
    struct Node
    {
        bool have_value;
        int value;
                        /*节点结构体*/
        Node *left,*right;
        Node():have_value(false),left(NULL),right(NULL){}
    
    };
    
                    /*全局变量写起来更方便*/
    char s[maxn];
    Node* root=NULL;
    bool faile;
                  
                    /*用来防止内存泄漏*/
    void remove_tree(Node* tree)
    {
        if(tree==NULL) return;
    
        remove_tree(tree->left);
        remove_tree(tree->right);
    
        delete tree;
    }
    
                    /*创建新节点封装成函数*/
    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) faile=true;
    
        u->value=v;
        u->have_value=true;
    }
    
    
                    /*读入数据并创建树,成功返回true读到文件结尾则返回false*/
    bool read_input()
    {
        faile=false;
    
        remove_tree(root);
        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;
    }
    
    
                    /*宽度优先算法,用队列实现将结果存在向量中*/
    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->value);
    
            if(u->left!=NULL) q.push(u->left);
            if(u->right!=NULL) q.push(u->right);
        }
    
        return true;
    }
    
    
    int main()
    {
    
        vector<int> v;
    
    
        while(read_input())
        {
            if(!bfs(v) || faile==true)
                printf("%d
    ",-1);
            else
                for(vector<int>::iterator i = v.begin(); i != v.end(); ++i)
                    printf("%d ",*i);
    
            cout<<endl;    
        }
    
    }

    2.数组实现

    #include <iostream>
    #include <vector>
    #include <queue>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    #define maxn 1000
    
    
    bool have_value[maxn];
    int tleft[maxn];
    int tright[maxn];
    int value[maxn];
    char s[100];
    bool faile;
    
    const int root=1;
    int cnt;
    
    void newtree()
    {
        tleft[root]=0;
        tright[root]=0;
    
        have_value[root]=false;
        cnt=root;
    }
    
    int newnode()
    {
        int u=++cnt;
    
        tleft[u]=0;
        tright[u]=0;
    
        have_value[u]=false;
    
        return u;
    }
    
    void addnode(int v,char* s)
    {
        int n=strlen(s);
    
        int u=root;
    
        for(int i=0;i<n;i++)
        {
            if(s[i]=='L')
            {
                if(tleft[u]==0)
                    tleft[u]=newnode();
                u=tleft[u];
            }
            else if(s[i]=='R')
            {
                if(tright[u]==0)
                    tright[u]=newnode();
                u=tright[u];
            }
        }
    
        if(have_value[u]) faile=true;
    
        value[u]=v;
        have_value[u]=true;
    }
    
    bool read_input()
    {
        faile=false;
    
        newtree();
    
        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;
    }
    
    bool bfs(vector<int>& ans)
    {
        queue<int> q;
        ans.clear();
    
        q.push(root);
    
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
    
            if(!have_value[u]) return false;
    
            ans.push_back(value[u]);
    
            if(tleft[u]!=0) q.push(tleft[u]);
            if(tright[u]!=0) q.push(tright[u]);
        }
    
        return true;
    }
    
    
    int main()
    {
    
        vector<int> v;
    
    
        while(read_input())
        {
            if(!bfs(v) || faile==true)
                printf("%d
    ",-1);
            else
                for(vector<int>::iterator i = v.begin(); i != v.end(); ++i)
                    printf("%d ",*i);
    
            cout<<endl;    
        }
    
    }

    书上的接口写的太棒了,换了种实现方式,代码基本上没改,比我自己写的接口不知道高到哪里去了.

    Yosoro
  • 相关阅读:
    NGUI_Depth
    NGUI_Font
    NGUI_Atlas
    NGUI_概述
    02、Mecanim之IK动画
    JAVA8学习——深入Comparator&Collector(学习过程)
    JAVA8学习——从源码角度深入Stream流(学习过程)
    JAVA8学习——从使用角度深入Stream流(学习过程)
    JAVA8学习——深入浅出方法引用(学习过程)
    回顾2019,总结,反思,展望,行动。
  • 原文地址:https://www.cnblogs.com/tclan126/p/7252781.html
Copyright © 2020-2023  润新知