美文网首页
C语言实现二叉树非递归遍历(前、中、后、层次)

C语言实现二叉树非递归遍历(前、中、后、层次)

作者: 七夜君_095a | 来源:发表于2020-08-25 16:12 被阅读0次

#include <stdio.h>

#include <stdlib.h>

#define MAXSIZE 20

typedef char ElemType;

typedef struct Node

{

    ElemType val;

    struct Node *lchild;

    struct Node *rchild;

} TNode, *BiTree;

typedef struct

{

    BiTree *base;

    BiTree *top;

    int stacksize;

} Stack;

typedef struct

{

    BiTree data[MAXSIZE];

    int front, rear;

} Queue;

void InitStack(Stack *S)

{

    S->base = (BiTree *)malloc(sizeof(BiTree) * 20);

    if(!S->base)

    {

        exit(-1);

    }

    S->top = S->base;

    S->stacksize = 20;

}

int StackEmpty(Stack *S)

{

    if(S->base == S->top)

    {

        return 1;

    }

    else

    {

        return 0;

    }

}

void Push(Stack *S, BiTree b)

{

    if(S->top - S->base >= S->stacksize)

    {

        S->base = (BiTree *)realloc(S->base, sizeof(BiTree) * (S->stacksize + 10));

        if(!S->base)

        {

            exit(-1);

        }

        S->top = S->base + S->stacksize;

        S->stacksize += 10;

    }

    *S->top = b;

    S->top += 1;

}

void Pop(Stack *S, BiTree *b)

{

    if(S->top == S->base)

    {

        exit(-1);

    }

    S->top -= 1;

    *b = *S->top;

}

void GetTop(Stack *S, BiTree *b)

{

    if(S->top == S->base)

    {

        exit(-1);

    }

    S->top -= 1;

    *b = *S->top;

    S->top += 1;

}

void InitQueue(Queue *Q)

{

    Q->front = Q->rear = 0;

}

int QueueEmpty(Queue *Q)

{

    if(Q->front == Q->rear)

    {

        return 1;

    }

    else

    {

        return 0;

    }

}

void EnQueue(Queue *Q, BiTree e)

{

    if((Q->rear + 1) % MAXSIZE == Q->front)

    {

        exit(-1);

    }

    Q->data[Q->rear] = e;

    Q->rear = (Q->rear + 1) % MAXSIZE;

}

void DeQueue(Queue *Q, BiTree *e)

{

    if(Q->rear == Q->front)

    {

        exit(-1);

    }

    *e = Q->data[Q->front];

    Q->front = (Q->front + 1) % MAXSIZE;

}

void Create(BiTree *T)

{

    printf("Input a char: ");

    ElemType ch = getchar();

    getchar();

    if(ch == '#')

    {

        (*T) = NULL;

    }

    else

    {

        (*T) = (BiTree)malloc(sizeof(TNode));

        if(!T)

        {

            exit(-1);

        }

        (*T)->val = ch;

        Create(&(*T)->lchild);

        Create(&(*T)->rchild);

    }

}

void PreOrder(BiTree T, Stack *S)

{

    BiTree p = T;

    while(p || !StackEmpty(S))

    {

        if(p)

        {

            printf("%4c", p->val);

            Push(S, p);

            p = p->lchild;

        }

        else

        {

            Pop(S, &p);

            p = p->rchild;

        } 

    }

}

void InOrdeer(BiTree T, Stack *S)

{

    BiTree p = T;

    while(p || !StackEmpty(S))

    {

        if(p)

        {

            Push(S, p);

            p = p->lchild;

        }

        else

        {

            Pop(S, &p);

            printf("%4c", p->val);

            p = p->rchild;

        }

    }

}

void PostOrder(BiTree T, Stack *S)

{

    BiTree p = T;

    BiTree cur = NULL;

    while(p || !StackEmpty(S))

    {

        if(p)

        {

            Push(S, p);

            p = p->lchild;

        }

        else

        {

            GetTop(S, &p);

            if(p->rchild && cur != p->rchild)

            {

                p = p->rchild;

                Push(S, p);

                p = p->lchild;

            }

            else

            {

                Pop(S, &p);

                printf("%4c", p->val);

                cur = p;

                p = NULL;

            }

        }

    }

}

void LevelOrder(BiTree T, Queue *Q)

{

    BiTree p = T;

    EnQueue(Q, p);

    while(!QueueEmpty(Q))

    {

        DeQueue(Q, &p);

        printf("%4c", p->val);

        if(p->lchild)

        {

            EnQueue(Q, p->lchild);

        }

        if(p->rchild)

        {

            EnQueue(Q, p->rchild);

        }

    }

}

int main()

{

    Stack S;

    Queue Q;

    BiTree T;

    InitStack(&S);

    InitQueue(&Q);

    Create(&T);

    printf("前序遍历:");

    PreOrder(T, &S);

    printf("\n");

    printf("中序遍历:");

    InOrdeer(T, &S);

    printf("\n");

    printf("后序遍历:");

    PostOrder(T, &S);

    printf("\n");

    printf("层次遍历:");

    LevelOrder(T, &Q);

    printf("\n");

    return 0;

}

相关文章

  • 算法之二叉树

    二叉树之C++实现 创建二叉树 复制二叉树 先序遍历 递归实现 非递归实现 中序遍历 递归实现 非递归实现 后序遍...

  • 左神算法笔记——Morris遍历

    基本问题——实现二叉树的前序、中序、后序遍历 (递归、非递归,mirros方法) 递归 递归方式下的前中后遍历 非...

  • Java二叉树的遍历

    Java二叉树的遍历 利用递归和非递归实现二叉树的先序,中序,后序遍历以及使用队列实现二叉树的层次遍历

  • 各种二叉树遍历

    C++实现,二叉树的递归、非递归版本的前序、中序、后序遍历。

  • 二叉树遍历java,非递归、层次。

    /** * 前序遍历 * 递归 */ /*** 前序遍历* 非递归*/ 后续遍历非递归 二叉树层次遍历基于java...

  • 数据结构重学日记(二十二)二叉树的层次遍历

    二叉树的层次遍历也属于非递归遍历,和之前先序、中序、后序遍历的区别在于层次遍历需要借助队列来实现。 层次遍历的操作...

  • 07-13:二叉树review1

    二叉树review1: 1、二叉树结构 1)二叉树的遍历 0)递归/迭代实现 前/中/后序遍历 递归 迭代 层次遍...

  • 总结

    1、二叉树广度遍历(非递归) 广度遍历非递归实现需要依靠一个队列。 2、二叉树深度遍历(递归与非递归,前序,中序和...

  • 二叉树

    来源 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现 二叉树的实现及先序、...

  • 二叉树

    结构体 创建二叉树 递归遍历 栈操作 非递归遍历 层次遍历 完整代码

网友评论

      本文标题:C语言实现二叉树非递归遍历(前、中、后、层次)

      本文链接:https://www.haomeiwen.com/subject/vxgiuxtx.html