二叉树的非递归遍历

Posted ycw1024

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的非递归遍历相关的知识,希望对你有一定的参考价值。

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

节点结构体:

#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;
        
    

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

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

以上是关于二叉树的非递归遍历的主要内容,如果未能解决你的问题,请参考以下文章

最简方式实现二叉树的非递归遍历

二叉树的非递归遍历

Java实现二叉树的创建递归/非递归遍历

转更简单的非递归遍历二叉树的方法

二叉树的非递归遍历

二叉树的非递归遍历