1. 程式人生 > >二叉樹非遞迴遍歷(三種+層序)

二叉樹非遞迴遍歷(三種+層序)

#include <iostream>
#include <stdio.h>
#include <queue>
#include <stack>
using namespace std;

typedef struct BiTNode{
    char data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

BiTree CreateBiTree(){
    char ch;
    BiTree T;
    cin>>ch;
    if(ch=='#') T=NULL;
    else{
        T = (BiTree)malloc(sizeof(BiTNode));
        T->data = ch;
        T->lchild = CreateBiTree();
        T->rchild = CreateBiTree();
    }
    return T;
}

void PreOrderTraverse(BiTree T){
    stack<BiTree> s;
    while(!s.empty() || T){
        while(T){
            cout<<T->data<<" ";
            s.push(T) ;
            T = T->lchild;
        }
        if(s.top()){
            T = s.top();
            s.pop();
            T = T->rchild;
        }
    }
}

void InOrderTraverse(BiTree T){
    stack<BiTree> s;
    while(!s.empty() || T){
        while(T){
            s.push(T) ;
            T = T->lchild;
        }
        if(s.top()){
            T = s.top();
            s.pop();
            cout<<T->data<<" ";
            T = T->rchild;
        }
    }
}

void PostOrderTraverse(BiTree T){
    stack<BiTree> s;
    BiTree visited = NULL;
    BiTree pr = T;
    while(!s.empty() || pr){
        while(pr){
            s.push(pr) ;
            pr = pr->lchild;
        }
        T = s.top();
        if(T->rchild == NULL || T->rchild == visited ){
            cout<<T->data<<" ";
            s.pop();
            visited = T;
        }
        else{
            pr = T->rchild;
        }
    }
}

void LeverOrderTraverse(BiTree T){
    queue<BiTree> q;
    BiTree p;
    if(T == NULL) return ;
    q.push(T);
    while(!q.empty()){
        p = q.front();
        cout<<p->data<<" ";
        q.pop();
        if(p->lchild != NULL ) q.push(p->lchild);
        if(p->rchild != NULL ) q.push(p->rchild);
    }
}

int main()
{
    BiTree T= CreateBiTree();
    PreOrderTraverse(T);
    cout<<endl;
    InOrderTraverse(T);
    cout<<endl;
    PostOrderTraverse(T);
    cout<<endl;
    LeverOrderTraverse(T);
    cout<<endl;
}