遍历二叉树的非递归写法

#include 
using namespace std;
struct Tree{
    int data;
    bool tag;
    Tree *lchild, *rchild;
};
Tree* CreatTree(){
    Tree* root=new Tree;
    cin>>root->data;
    if(root->data==-1) root=NULL;
    else{
        root->lchild=CreatTree();
        root->rchild=CreatTree();
    }
    return root;
}
void MidTreval(Tree *t){
    stack s;
    Tree *p=t;
    while(p||!s.empty()){
        if(p){
            s.push(p);
            p=p->lchild;
        }
        else{
            p=s.top();
            cout<data<<' ';
            s.pop();
            p=p->rchild;
        }
    }
}
void PreTreval(Tree* t){
    stack s;
    Tree *p=t;
    while(p||!s.empty()){
        if(p){
            cout<data<<' ';
            s.push(p);
            p=p->lchild;
        }
        else{
            p=s.top();
            s.pop();
            p=p->rchild;
        }
    }
}
void PostTreval(Tree *t){
    stack s;
    s.push(t);
    Tree* p;
    while(!s.empty()){
        p=s.top();
        if(p->lchild&&!p->lchild->tag) s.push(p->lchild);
        else{
            p->tag=1;
            if(p->rchild&&!p->rchild->tag) s.push(p->rchild);
            else{
                cout<data<<' ';
                s.pop();
            }
        }
    }
}
void LayerTreval(Tree *t){
    queue q;
    q.push(t);
    while(!q.empty()){
        Tree *p=q.front();
        q.pop();
        cout<data<<' ';
        if(p->lchild) q.push(p->lchild);
        if(p->rchild) q.push(p->rchild);
    }
}
int main(){
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    Tree* root=CreatTree();
    LayerTreval(root);
    return 0;
}

你可能感兴趣的:(遍历二叉树的非递归写法)