二叉树的非递归遍历

Posted O了吗

tags:

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

#include"iostream"
#include"stack"
using namespace std;
typedef char element;
class Tree{
private:
    element data;
    Tree *right,*left;
public:
    Tree(element data = 0){
        this->data = data;
        right = NULL;
        left = NULL;
    }

    void cinCreate(Tree* &t){
        element data;
        cin>>data;
        if(data != #){
            t = new Tree(data);
            cinCreate(t->left);
            cinCreate(t->right);
        }
    }
    //非递归的先序遍历
    void showux(){
        stack<Tree*> s;
        Tree *t = this;
        while(t || !s.empty()){
            while(t){
                s.push(t);
                cout<<t->data<<ends;
                t = t->left;
            }
            t = s.top();
            s.pop();
            t = t->right;
        }
    }
    //非递归的中序遍历
    void showuz(){
        stack<Tree*> s;
        Tree *t = this;
        while(t || !s.empty()){
            while(t){
                s.push(t);
                t = t->left;
            }
            t = s.top();
            s.pop();
            cout<<t->data<<ends;
            t = t->right;
        }
    }
    //后序遍历比较复杂,此处不写



    //更方便的非递归遍历(前中后)
    void showux1(){
        stack<Tree*> s;        //树结点
        stack<int> v;        //标志位(标记根节点 与 孩子结点,是根结点就输出)
        Tree *t = this;int v1;
        s.push(t);v.push(0);
        while(!s.empty()){
            t = s.top();v1 = v.top();
            s.pop();v.pop();
            if(v1){
                cout<<t->data<<ends;
            }
            else if(t){
                //只需调整位置就可完成 前中后序遍历
                s.push(t->right);v.push(0);
                s.push(t);v.push(1);
                s.push(t->left);v.push(0);
            }
        }
    }
    //递归的先序遍历
    void showx(){
        if(this){
            cout<<data<<ends;
            left->showx();
            right->showx();
        }
    }

};
/*
124##5##36##7##
*/
int main(){
    Tree *t;
    t->cinCreate(t);
    t->showx();
    cout<<endl;
    t->showux1();
    return 0;
}

 

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

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

二叉树的非递归遍历

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

《数据结构》遍历二叉树的非递归算法的疑问。

二叉树经典题之二叉树的非递归遍历

[算法]二叉树的非递归遍历算法