中序遍历二叉树(非递归算法 c语言)

#include “stdio.h”
#include “string.h”
#include “malloc.h”
#define NULL 0
#define MAXSIZE 30
typedef struct BiTNode      //定义二叉树数据结构
{
    char data;
    struct BiTNode *lchild,*rchild;
} BiTNode;

typedef struct Queue      //定义顺序结构队列数据结构(层序遍历需要借助队列)
{
    struct BiTNode * data[MAXSIZE];
    int front,rear;
} Queue;

typedef struct Stack      //定义顺序结构栈数据结构(非递归遍历二叉树需要借助栈)
{
    struct BiTNode * data[MAXSIZE];
    int top;
} Stack;

bool isEmpty(Queue *);//判队列是否空
bool InitStack(Stack *& s)//初始化栈
{
    if(!(s=(Stack *)malloc(sizeof(Stack))))
    {
        return false;
    }
    else
    {
        s->top=-1;
    }
}
bool isFullStack(Stack *s)//判栈是否满
{
    if((s->top)==(MAXSIZE-1))
    {
        return true;
    }
    else
        return false;
}
bool isEmptyStack(Stack *s)//判栈是否空
{
    if((s->top)==-1)
    {
        return true;
    }
    else
        return false;
}
bool push(Stack *s,BiTNode *&bitnode)//入栈
{
    if(!isFullStack(s))
    {
        s->top++;
        s->data[s->top]=bitnode;
        return true;
    }
    else
        return false;
}
bool pop(Stack *s,BiTNode *& bitnode)//入栈
{
    if(s->top==-1)
    {
        return false;
    }
    else
    {
        bitnode=s->data[s->top];
        (s->top)–;
        return true;
    }
}
bool InitQueue(Queue *& q)//初始化队列
{
    if(!(q=(Queue *)malloc(sizeof(Queue))))
    {
        return false;
    }
    else
    {
        q->front=0;
        q->rear=0;
        return true;
    }
}
void enQueue(Queue *q,BiTNode * data)//入队
{
    if(q->front==(q->rear+1))
    {
        printf(“Queue is full\n”);
    }
    else
    {
        q->data[q->rear]=data;
        q->rear=((q->rear)+1)%MAXSIZE;
    }
}
void deQueue(Queue *q,BiTNode *& data)//出队
{
    if(!isEmpty(q))
    {
        data=q->data[q->front];
        q->front=(q->front+1)%MAXSIZE;
    }
}
bool isEmpty(Queue *q)//判队空
{
    if(q->front==q->rear)
    {
        return true;
    }
    else
        return false;
}

void preCreate(BiTNode *& T)   //先序遍历建立二叉树
{
    char ch;
    ch=getchar();
    if(ch==’#’)
        T=NULL;
    else
    {
        if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
            printf(“Error!”);
        T->data=ch;
        preCreate(T->lchild);
        preCreate(T->rchild);
    }
}

void inOrderNo(BiTNode * T)//非递归进行中序遍历,借助于栈

{

    BiTNode * temp=T;

    Stack *s;

    InitStack(s);

    while(temp!=NULL||!isEmptyStack(s))

    {

        if(temp!=NULL)

        {

            if(push(s,temp))

                temp=temp->lchild;

            else

                printf(“压栈失败\n”);

        }

        else

        {

            if(pop(s,temp))

            {

                printf(“%c”,temp->data);

                temp=temp->rchild;

            }

            else

                printf(“弹栈失败\n”);

        }

    }

}

void levelOrder(BiTNode * T)//层序遍历,借助于队列

{

    BiTNode * node=T;

    Queue * queue=NULL;

    InitQueue(queue);

    enQueue(queue,T);

    while(!isEmpty(queue))

    {

        deQueue(queue,T);

        printf(“%c”,T->data);

        if(T->lchild!=NULL)

            enQueue(queue,T->lchild);

        if(T->rchild!=NULL)

            enQueue(queue,T->rchild);

    }

}

int main()
{
    BiTNode * bitree=NULL;
    preCreate(bitree);//先序遍历建立二叉树

    printf(“\n中序遍历:(非递归)”);

    inOrderNo(bitree);

    printf(“\n层序遍历:”);
    levelOrder(bitree);

    return 0;
}

    原文作者:递归算法
    原文地址: https://blog.csdn.net/u010660346/article/details/47045579
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞