zoukankan      html  css  js  c++  java
  • 二叉树的非递归遍历

    二叉树的遍历我想大家都知道了,主要有先序、中序、后序,递归的遍历我就不说了,今天小编给大家主要介绍下二叉树的非递归遍历。

    节点结构体:

    #include<stack>
    enum tag { L, R };
    template<typename T>//可以变成类
    struct BintNode
    {
        BintNode():left(nullptr),right(nullptr),value(0){}
        BintNode(T v)
        {
            left = nullptr;
            right = nullptr;
            value = v;
        }
        T value;
        BintNode<T> *left;
        BintNode<T> *right;    
    };
    template<typename E>
    struct stkNode
    {
        stkNode(BintNode<E>*N=nullptr):ptr(N), r(L){}
        BintNode<E>*ptr;
        tag r;
    };

    首先是先序遍历,借助栈实现的。

    void nonrepreorder(BintNode<Y>*root)const//非递归先序
        {
            if (root)
            {
                stack<BintNode<Y>*> bitr;
                bitr.push(root);
                BintNode<Y>*p;
                while (!bitr.empty())
                {
                    p = bitr.top();
                    bitr.pop();
                    cout << p->value;
                    if (p->right != nullptr)
                       bitr.push(p->right);
                    if(p->left!=nullptr)
                        bitr.push(p->left);
                }
            }
        }

    下来时中序遍历

    void nonreinorder(BintNode<Y>*root)const//非递归中序//左根右
        {
            if(root)
            {
                stack<BintNode<Y>*>bitr;
                BintNode<Y>*p = root;
                do
                {
                    while(p!=nullptr)
                    {
                        bitr.push(p);
                        p = p->left;
                    }
                    if(!bitr.empty())
                    {
                        p=bitr.top();
                        bitr.pop();
                        cout << p->value;
                        p=p->right;
                    }
                } while (!bitr.empty() || p != nullptr);
            }
        }

    之后是后序遍历

    void nonrepostorder(BintNode<Y>*root)const//非递归后序
        {
            if(root)
            {
                stack<stkNode<Y>>bitr;
                stkNode<Y>w;
                BintNode<Y>*p=root;
                do
                {
                    while(p)
                    {
                        w.ptr = p; 
                        w.r = L;
                        bitr.push(w);
                        p = p->left;
                    }
                    int continuel = 1;
                    while(continuel&&!bitr.empty())
                    {
                        w = bitr.top();
                        bitr.pop();
                        p = w.ptr;
                        if (w.r == L)
                        {
                            w.r=R;
                            bitr.push(w);
                            continuel = 0;
                            p = w.ptr->right;
                        }
                        else
                            cout << w.ptr->value;
                    }
                }
                while (!bitr.empty());
            }
        }

    后序遍历小编在压栈时将节点进行了包装从而实现从左子树到右子树的转换。

    最后在送大家一个层次遍历吧!

    #include<queue>
    void levelorder(BintNode<Y>*root)const
        {
            if(root!=NULL)
            {
                queue<BintNode<Y>*> que;
                que.push(root);
                while(!que.empty())
                {
                    root = que.front();
                    que.pop();
                    if (root->left)
                        que.push(root->left);
                    if (root->right)
                        que.push(root->right);
                    cout << root->value << " ";
                }
                cout << endl;
            }
        }

    -------------------------------------------------------------

      无冥冥之志者,无昭昭之明;无惛惛之事者,无赫赫之功!

  • 相关阅读:
    如何进入闷声发大财的传统企业做数据分析工作,帮助企业做数字转型?
    做一个最好的自己,不盲目学数据分析
    sql server如何判断数据库是否存在
    c++引用深入探讨
    VirtualBox 安装ghost版windows XP
    QT透明显示文字
    CSAPP
    随机颜色的生成
    远程桌面如何传递声音的原理
    递归求解全排列
  • 原文地址:https://www.cnblogs.com/ycw1024/p/11395443.html
Copyright © 2011-2022 走看看