中序非递归遍历序列二叉树

本文介绍了如何使用栈实现中序非递归遍历二叉树的方法,通过先序创建二叉树并利用二级指针解决节点存储问题。在遍历过程中,详细阐述了栈的操作,包括入栈、出栈,以及何时出栈的判断条件,帮助读者理解非递归遍历的逻辑。
摘要由CSDN通过智能技术生成

1、中序非递归遍历序列二叉树

同学们一定要留意一下这一步: pop(s,&q);这一步涉及到一个二级指针的问题(当然不用二级指针也可以解决问题,只不过大多部分教材都会用二级指针来解题),二级指针的问题我直接上图,其实二级指针就是一个抽屉里面放另外一个抽屉的钥匙罢啦;
在这里插入图片描述


#include <stdio.h>
#include <mm_malloc.h>

#define MAXSIZE 50
#define OK 1
#define ERROR -1

typedef struct{
    char data;
    struct BiNode *LChild;
    struct BiNode *RChild;


}BiTNode,*BiTree;


typedef struct SqeStack{

    BiTree elem[MAXSIZE];
    int top;

}SqeStack,*Sqe;

int main(){
    void PreCreateBiTree(BiTree *T);
    void UnrecursiveInorder(BiTree T);
    BiTree T ;
    //先序创建树
    PreCreateBiTree(&T);
    printf("中序非递归遍历序列为:");
    UnrecursiveInorder(T);
}

//先序创建二叉树
void PreCreateBiTree(BiTree *T){//这里必须要用二级指针,不用你操作的结果根本拿不到,你可以先用一级指针思考一下,你就会发现真的很妙,

    char ch;
    ch = getchar();
    if (ch != '.'){
        *T = (BiTNode *)malloc(sizeof(BiTNode));
        (*T)->data = ch;
        PreCreateBiTree(&((*T)->LChild));//这个地方要传地址而不是temp->LChild,temp->LChild是等于NULL的,你要给这个变量的地址才行
        PreCreateBiTree(&((*T)->RChild));
    }else{
        *T = NULL;
    }
}

//初始化顺序栈
Sqe InitStack(){

    SqeStack *s = (SqeStack *)malloc(sizeof(SqeStack));
    s->top = -1;
    return s;

}

//插入数据(说入栈和压栈高级点)
int push(Sqe sqe,BiTree elem){
    if (sqe->top == MAXSIZE-1){
        printf("栈已满");
        exit(0);
    }
    sqe->top++;
    sqe->elem[sqe->top] = elem;
    return OK;
}

//出栈或者说弹栈
int pop(Sqe s,BiTree *elem){

    if (s->top == -1){
        printf("栈为空");
        exit(0);
    }

    *elem = s->elem[s->top]; //将出栈的元素返回,弹栈其实元素还在,但是不用管它,因为有元素入栈的时候,该元素就会被覆盖
    s->top--;
    return 1;
}

int isEmpty(struct SqeStack *s){
    return s->top == -1 ? 1 : 0;  //空返回1,否则,为0
}

//中序非递归遍历二叉树 使用栈   中序遍历遇到根先存储起来
void UnrecursiveInorder(BiTree T){
    BiTree p = T,q;
    Sqe s = InitStack();
    while( !isEmpty(s) || p != NULL){//当栈为空且p指向为NULL的时候结束循环
        if (p!=NULL){
            push(s,p);//当前p指向的节点进栈
            p = p->LChild;//继续扫描左孩子
        }else{
            pop(s,&q);//当前节点的父节点出栈,并且让p指向父节点的右孩子   这个地方一定要是取地址,不然你就得不到父节点
            printf("%c",q->data);
            p = q->RChild;
        }

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值