美文网首页
各种二叉树遍历

各种二叉树遍历

作者: chnmagnus | 来源:发表于2017-09-10 13:38 被阅读15次

C++实现,二叉树的递归、非递归版本的前序、中序、后序遍历。

// 二叉树结点
struct Node{
    int val;
    Node *left,*right;
    Node():left(nullptr),right(nullptr){}
    Node(int _v):val(_v),left(nullptr),right(nullptr){}
};

// 二叉搜索树
struct Tree{
    Node *root; //根节点
    std::vector<int> p; //存储遍历的结果

    Tree():root(nullptr){}
    ~Tree(){
        release(root);
    }

    // 输出p数组的内容
    void print(){
        for(size_t i=0;i<p.size();++i){
            std::cout<<p[i]<<" ";
        }
        std::cout<<std::endl;
    }

    // 插入节点
    void insert(int val){
        if(root==nullptr){
            root = new Node(val);
            return ;
        }
        Node *cur = root;
        while(true){
            if(val<=cur->val){
                if(cur->left){
                    cur = cur->left;
                }else{
                    cur->left = new Node(val);
                    return ;
                }
            }else{
                if(cur->right){
                    cur = cur->right;
                }else{
                    cur->right = new Node(val);
                    return ;
                }
            }
        }
    }

    // 三种递归遍历方式
    void _rpreorder(Node *r){
        if(r){
            p.push_back(r->val);
            _rpreorder(r->left);
            _rpreorder(r->right);
        }
    }
    void rpreorder(){
        p.clear();
        _rpreorder(root);
    }

    void _rinorder(Node *r){
        if(r){
            _rinorder(r->left);
            p.push_back(r->val);            
            _rinorder(r->right);
        }
    }
    void rinorder(){
        p.clear();
        _rinorder(root);
    }

    void _rpostorder(Node *r){
        if(r){
            _rpostorder(r->left);
            _rpostorder(r->right);
            p.push_back(r->val);            
        }
    }
    void rpostorder(){
        p.clear();
        _rpostorder(root);
    }

    // 三种非递归遍历方式
    void preorder(){
        p.clear();
        if(root==nullptr) return ;
        std::stack<Node*> st;
        Node *cur = root;

        while(cur || !st.empty()){
            while(cur){
                p.push_back(cur->val);
                st.push(cur);
                cur = cur->left;
            }
            if(!st.empty()){
                cur = st.top();
                st.pop();
                cur = cur->right;
            }
        }
    }

    void inorder(){
        p.clear();
        if(root==nullptr) return ;
        std::stack<Node*> st;
        Node *cur = root;
        while(cur || !st.empty()){
            while(cur){
                st.push(cur);
                cur = cur->left;
            }
            if(!st.empty()){
                cur = st.top();
                st.pop();
                p.push_back(cur->val);
                cur = cur->right;
            }
        }
    }

    void postorder(){
        p.clear();
        if(root==nullptr) return ;
        Node *cur = root;
        Node *last = nullptr; //上一个输出的节点
        std::stack<Node*> st;

        while(cur || !st.empty()){
            while(cur){
                st.push(cur);
                cur = cur->left;
            }
            cur = st.top();
            if(cur->right==nullptr || cur->right==last){
                p.push_back(cur->val);
                st.pop();
                last = cur;
                cur = nullptr;
            }else{
                cur = cur->right;
            }
        }

    }
    void release(Node *r){
        if(r==nullptr) return ;
        if(r->left) release(r->left);
        if(r->right) release(r->right);
        delete r;
        r = nullptr;
    }
};

相关文章

  • 二叉树的递归遍历(java版)

    1. 场景需求 二叉树如图 java中利用递归实现二叉树的各种遍历 前序遍历 中序遍历 后序遍历 3.代码实现 3...

  • 【算法打卡60天】Day18二叉树基础(下)

    Day19学习内容:二叉树各种遍历方法,以及各自的特点。遍历主要分为如下三种方式:1.二叉树的遍历方法一:前序遍历...

  • 二叉树 基础操作

    二叉树的使用 二叉树结构 先序创建二叉树 DFS 先序遍历二叉树 中序遍历二叉树 后序遍历二叉树 BFS 层次遍历...

  • 关于二叉树的算法题

    前序遍历中序遍历后序遍历判断是否是平衡二叉树判断是否是对称二叉树判断二叉树高度按照层遍历二叉树判断二叉树宽度

  • 二叉树遍历

    二叉树 二叉树的存储结构 前序遍历 中序遍历 后序遍历 遍历代码 反转二叉树 深入学习二叉树 二叉树-你必须要懂!...

  • 二叉树操作

    树节点 逐行顺序解析二叉树 前序遍历二叉树 中序遍历二叉树 后序遍历二叉树 删除指定数值的节点 前序遍历顺序存储的...

  • 数据结构与算法之二叉树遍历(七)

    目录 前序遍历中序遍历后序遍历层序遍历遍历方式的选择条件根据遍历结果重构二叉树翻转二叉树计算二叉树的高度判断一棵树...

  • 二叉树三种遍历Swift代码实现

    二叉树的三种遍历 二叉树 前序遍历 中序遍历 后序遍历 另外 不得不说,得到二叉树的前序遍历和中序遍历的结果或者后...

  • 二叉树的遍历

    二叉树的遍历 二叉树遍历 分为前序遍历、中序遍历和后序遍历。 前序遍历 (DLR) 先访问根节点,然后前序遍历左子...

  • 前端二叉树

    (一)构造二叉树 (二)中序遍历 (三)前序遍历 前序遍历可以复制二叉树,效率比重新构造二叉树高 (四)后序遍历 ...

网友评论

      本文标题:各种二叉树遍历

      本文链接:https://www.haomeiwen.com/subject/wzgzjxtx.html