前、中、后、序递归遍历二叉树以及非递归遍历

#include"stdio.h"
#include"malloc.h"
#include"LinkStack.c"
typedef int ElemType;
typedef struct BitNode{
    ElemType data;
    struct BitNode *lchild,*rchild;
}BitTree;

//1、利用前序遍历递归创建二叉树

BitTree * CreateTree(){
    BitTree *T;
    ElemType e;
    printf("请输入元素的值,-1代表到叶子结点:");
    scanf("%d",&e);
    if(e == -1){
        return NULL;
    }else{
        T=(BitTree *)malloc(sizeof(BitTree));
        if(!T){
            printf("结点分配失败!\n");
        }else{
            T->data=e;
            T->lchild=CreateTree();
            T->rchild=CreateTree();
        }

        return T;
    }
}
//1、递归前序遍历二叉树

void FVisit(BitTree *T){
    if(T){
        printf("%d\t",T->data);
        FVisit(T->lchild);
        FVisit(T->rchild);
    }
}
//2、递归中序遍历二叉树

void MVisit(BitTree *T){
    if(T){

        MVisit(T->lchild);
        printf("%d\t",T->data);
        MVisit(T->rchild);
    }
}
//3、递归后序遍历二叉树

void LVisit(BitTree *T){
    if(T){

        LVisit(T->lchild);
        LVisit(T->rchild);
        printf("%d\t",T->data);
    }
}

//4、前序非递归遍历二叉树
void  PreOrder(BitTree *T ,void (*visit)(BitTree *T)){

    if(T==NULL){
        return ;
    }
    //初始化辅助栈
    LinkStack *s;
    s=InitStack();
    BitTree *p=T;
    while(p != NULL){
        visit(p);//访问根节点p
        if(p->rchild != NULL){
            Push(s,p->rchild);//右孩子进栈

        }
        if(p->lchild != NULL){
            p=p->lchild;//指向左孩子
        }
        else{//回溯
            if(IsEmpty(s)){
                break;
            }
            p=GetTop(s);
            Pop(s);
        }
    }
}
/*
//5、中序非递归遍历二叉树
void  InOrder(BitTree *T ,void (*visit)(BitTree *T)){
    if(T==NULL){
        return ;
    }
    //初始化辅助栈
    LinkStack *s;
    s=InitStack();
    BitTree *p=T;
    do{
       while(p != NULL){//一直到最左下
           Push(s,p);
           p=p->lchild;
       }
       //若进行到这里左子树为空
       if(!IsEmpty(s)){//栈不为空时退栈,然后访问该元素
            p=GetTop(s);
            Pop(s);
            visit(p);
            p=p->rchild;
       }
    }while(p != NULL || !IsEmpty(s));//p==NuLL表示右子树为空,然后栈如果也为空的话,处理完毕
}
*/
/*
//6、后序非递归遍历二叉树
void  PostOrder(BitTree *T ,void (*visit)(BitTree *T)){
    if(T==NULL){
        return ;
    }
    //初始化辅助栈
    LinkStack *s;
    s=InitStack();
    BitTree *cur=T;//当前结点
    BitTree *pre=NULL;//前一次访问的结点
    while(cur != NULL || !IsEmpty(s)){
        while(cur != NULL){
            Push(s,cur);
            cur=cur->lchild;
        }
        cur=GetTop(s);
        //当前结点的右孩子如果为空或者已经被访问过,则访问当前结点
        if(cur->rchild == NULL || cur->rchild==pre){
            visit(cur);
            pre=cur;
            Pop(s);
            cur=NULL;
        }else{
            cur=cur->rchild;//否则访问右孩子
        }
    }
}
*/
void print(BitTree *T){
    printf("%d\t",T->data);
}

main(){
    BitTree *T;
   T=CreateTree();

   printf("递归前序遍历序列为:");
   FVisit(T);
   printf("\n");
    /*
   printf("递归中序遍历序列为:");
   MVisit(T);
   printf("\n");
   printf("递归后序遍历序列为:");
   LVisit(T);
   printf("\n");
   */
   printf("非递归前序遍历序列为:");
   PreOrder(T,print);
   printf("\n");
   /*
   printf("非递归中序遍历序列为:");
   InOrder(T,print);
   printf("\n");
   printf("非递归后序遍历序列为:");
   PostOrder(T,print);*/

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值