二叉树的前、中、后的非递归遍历

题目

实现一个链式存储的二叉树,采用非递归的形式,按照前、中、后序的顺序遍历二叉树。

代码

/**
* 二叉树的前、中、后序的非递归遍历
**/

#include <iostream>
using namespace std;
typedef char Element;
#define MAX 100
//定义二叉树
typedef struct TNode{
    
    
    Element data;
    struct TNode *lchild,*rchild;
}TNode,*BiTree;

//定义栈
typedef struct Stack{
    
    
    TNode *data[MAX];
    int top;
}Stack;

//创建二叉树,采用递归的方式
void createBiTree(BiTree &T){
    
    
    Element e;
    cin>>e;
    if(e=='#')
        T=NULL;
    else{
    
    
        T=(TNode *)malloc(sizeof(TNode));
        T->data=e;
        createBiTree(T->lchild);
        createBiTree(T->rchild);
    }
}
//输出二叉树
void dispBiTree(BiTree T){
    
    
    if(T!=NULL){
    
    
        cout<<T->data<<" ";
        dispBiTree(T->lchild);
        dispBiTree(T->rchild);
    }
}

//初始化栈
void initStack(Stack &S){
    
    
    S.top=-1;
}
//判栈空
bool isEmpty(Stack S){
    
    
    if(S.top==-1)
        return true;
    else
        return false;
}
//进栈
bool push(Stack &S,TNode *e){
    
    
    if(S.top==MAX-1)
        return false;
    else{
    
    
        S.data[++S.top]=e;
        return true;
    }
}
//出栈
bool pop(Stack &S,TNode *&x){
    
    
    if(S.top==-1)
        return false;
    else{
    
    
        x=S.data[S.top--];
        return true;
    }
}
/**
* 二叉树的先序遍历的非递归
**/
void preOrder(BiTree T){
    
    
    if(T==NULL)
        return;
    Stack S;
    TNode *t;
    initStack(S);
    push(S,T);
    while(!isEmpty(S)){
    
    
       pop(S,t);
       cout<<t->data<<" ";  
       if(t->rchild)    //因为栈是先进后出,所以应该先入栈右子树,再入左子树
            push(S,t->rchild);
       if(t->lchild)
            push(S,t->lchild);
    }
}

/**
* 二叉树的中序非递归遍历
**/
void inOrder(BiTree T){
    
    
    if(T==NULL)
        return;
    Stack S;
    TNode *p=T;
    initStack(S);

    while(!isEmpty(S) || p!=NULL){
    
    
        //将所有左子树进栈
        while(p){
    
    
            push(S,p);
            p=p->lchild;
        }
        //找到最左边的结点之后,先输出该结点
        pop(S,p);
        cout<<p->data<<" ";
        //然后找结点右子树(如果有的话)的最左边的结点
        p=p->rchild;

    }
}

/**
* 二叉树的后序非递归遍历
* 后序遍历可以按照前序的非递归的方式,按照根、右、左的方式前序遍历,然后再颠倒一下就可以了
**/
void postOrder(BiTree T){
    
    
    if(T==NULL)
        return;
    Stack S,result;
    initStack(S);   //工作栈
    initStack(result);  //存放结果的栈
    push(S,T);
    TNode *t;
    while(!isEmpty(S)){
    
    
        pop(S,t);
        push(result,t);
        if(t->lchild)
            push(S,t->lchild);
        if(t->rchild)
            push(S,t->rchild);
    }

    while(!isEmpty(result)){
    
    
        pop(result,t);
        cout<<t->data<<" ";
    }
}

int main() {
    
    
    BiTree T;
    createBiTree(T);
    dispBiTree(T);
    cout<<endl<<"前序非递归遍历:"<<endl;
    preOrder(T);
    cout<<endl<<"中序非递归遍历:"<<endl;
    inOrder(T);
    cout<<endl<<"后序非递归遍历:"<<endl;
    postOrder(T);
    return 0;
}

运行效果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/niulinbiao/article/details/127592288