第三章(二叉树的先序、中序(非递归实现))

本文介绍了一种使用栈实现二叉树先序和中序遍历的方法。通过定义二叉树结构和栈结构,实现了二叉树的创建、栈的初始化、元素的压入和弹出等操作。文章详细展示了如何利用栈辅助进行二叉树的遍历,包括先序遍历和中序遍历的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<stdlib.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INSEASIBLE -1
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREAMENT 10
 
typedef char ElemType;
typedef int Status;

typedef struct BiTNode
{
    ElemType date;
    struct BiTNode *lchild,*rchild;
 } BiTNode,*BiTree;
 
 typedef struct 
{
    BiTree* base;
    BiTree* top;
    int stacksize;
}bitStack;

Status InitStack_bit(bitStack &S)
{
    S.base=(BiTree*)malloc(STACK_INIT_SIZE*(sizeof(BiTree)));
    if(!S.base) exit(OVERFLOW);
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE; //别忘了这一步 
    return OK;
}
Status Push(bitStack &S,BiTree e)      //push进来的是指针地址 
{
    if(S.top-S.base>=S.stacksize)   //如果栈满了,需再申请空间 
    {
        S.base=(BiTree*)realloc(S.base,(S.stacksize+STACKINCREAMENT)*sizeof(BiTree));
        if(!S.base) exit(OVERFLOW);
        S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREAMENT;
    }
    *S.top++=e;
    return OK; 
}
BiTree Pop(bitStack &S)
{
    if(S.base==S.top) return ERROR;
    return *--S.top;
}
Status GetTop(bitStack &S,BiTree &e)
{
    if(S.base==S.top) return ERROR;
    e=*--S.top;
    S.top++;
    return OK;
}
int StackEmpty(bitStack S)
{
    if(S.top==S.base) return TRUE;
    return FALSE;
}
 Status CreateBiTree(BiTree &T)
 {
     ElemType ch;
     scanf("%c",&ch);
     if(ch==' ') T=NULL;
     else
     {
         T=(BiTree)malloc(sizeof(BiTNode));
         if(!T) exit(OVERFLOW);
         T->date=ch;
         CreateBiTree(T->lchild);
         CreateBiTree(T->rchild);
     }
     return OK;
     
 }
//先序遍历 
void PreOrderTraverse(BiTree T)
{
      BiTree P=T;               //为避免T指针的指向发生变化 则创建指针P指向T指的结点 
      bitStack S;               //声明栈 
    InitStack_bit(S);         //初始化栈 
    while(P||!StackEmpty(S))  //当树不空或者栈不空 则表明还有结点未遍历 
    {
        while(P)              //当树不空时 
        {
            Push(S,P);
            printf("%c",P->date);
            P=P->lchild;
        }
        if(!StackEmpty(S))   //如果栈不空时 
        {
            P=Pop(S);        //栈弹出栈顶元素(即指向结点的地址) 
            P=P->rchild;      //访问其右孩子 
        }
    }
 } 
 //中序遍历 
 void      InOrderTraverse(BiTree T)
 {
      BiTree P=T;
      bitStack S;
    InitStack_bit(S);
    while(P||!StackEmpty(S))
    {
        while(P)
        {
            Push(S,P);
            P=P->lchild;
        }
        if(!StackEmpty(S))
        {
            P=Pop(S);
            printf("%c",P->date);
            P=P->rchild;
        }
    }
 }
  int main()
 {
     BiTree T;
     printf("开始建树,请输入二叉树各个节点的值(按先序次序输入):\n");
     CreateBiTree(T);
     
     printf("\n 以下是该树的先序遍历序列:\n");
     PreOrderTraverse(T);
     
     printf("\n 以下是该树的中序遍历序列:\n");
     InOrderTraverse(T);
     
     printf("\n 以下是该树的后序遍历序列:\n");
     PostOrderTraverse(T);
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值