二叉树非递归遍历(前序、中序、后序)

前序遍历

void PreOrder(BiNode *bt){
    BiNode * p=bt;
    stack<BiNode*> s;
    while(p!=NULL||!s.empty()){
        while(p!=NULL){
            cout<<p->data<<" ";
            s.push(p);
            p=p->lchild;
        }
        if(!s.empty()){
            p=s.top();
            s.pop();
            p=p->rchild;
        }
    }
}

中序遍历

void InOrder(BiNode *bt){
    stack<BiNode*> s;
    BiNode *p=bt;
    while(p!=NULL||!s.empty()){
        while(p!=NULL){
            s.push(p);
            p=p->lchild;
        }
        if(!s.empty()){
            p=s.top();
            s.pop();
            cout<<p->data<<" ";
            p=p->rchild;
        }
    }
}

后序遍历

void PostOrder(BiNode* bt){
    BiNode *p=bt;
    element elem;
    stack<element> s;
    while(p!=NULL||!s.empty()){
        if(p!=NULL){
            elem.ptr=p;
            elem.flag=1;
            s.push(elem);
            p=p->lchild;
        }
        else{
            elem=s.top();
            s.pop();
            p=elem.ptr;
            if(elem.flag==1){
                elem.flag=2;
                s.push(elem);
                p=p->rchild;
            }
            else{
                cout<<p->data<<" ";
                p=NULL;
            }
        }
    }
}

完整代码

#include<iostream>
#include<stack>
using namespace std;
struct BiNode{
    char data;
    BiNode *lchild,*rchild;
};
struct element{
    BiNode *ptr;
    int flag;
};
void create(BiNode* &bt){
    char ch;
    cin>>ch;
    if(ch=='#') bt=NULL;
    else{
        bt=new BiNode;
        bt->data=ch;
        create(bt->lchild);
        create(bt->rchild); 
    }
}
void PreOrder(BiNode *bt){
    BiNode * p=bt;
    stack<BiNode*> s;
    while(p!=NULL||!s.empty()){
        while(p!=NULL){
            cout<<p->data<<" ";
            s.push(p);
            p=p->lchild;
        }
        if(!s.empty()){
            p=s.top();
            s.pop();
            p=p->rchild;
        }
    }
}
void InOrder(BiNode *bt){
    stack<BiNode*> s;
    BiNode *p=bt;
    while(p!=NULL||!s.empty()){
        while(p!=NULL){
            s.push(p);
            p=p->lchild;
        }
        if(!s.empty()){
            p=s.top();
            s.pop();
            cout<<p->data<<" ";
            p=p->rchild;
        }
    }
}
void PostOrder(BiNode* bt){
    BiNode *p=bt;
    element elem;
    stack<element> s;
    while(p!=NULL||!s.empty()){
        if(p!=NULL){
            elem.ptr=p;
            elem.flag=1;
            s.push(elem);
            p=p->lchild;
        }
        else{
            elem=s.top();
            s.pop();
            p=elem.ptr;
            if(elem.flag==1){
                elem.flag=2;
                s.push(elem);
                p=p->rchild;
            }
            else{
                cout<<p->data<<" ";
                p=NULL;
            }
        }
    }
}
int main(){
    BiNode *root;
    create(root);
    PreOrder(root);
    cout<<endl;
    InOrder(root);
    cout<<endl;
    PostOrder(root);
    return 0;
}

输入:

AB#D##C##

输出:

A B D C
B D A C
D B C A

posted @ 2021-03-28 15:50  gonghr  阅读(227)  评论(0编辑  收藏  举报