数据结构: 递归先序创建二叉树及其先序,中序和后序遍历

递归先序创建二叉树及其先序,中序和后序遍历:

(C语言实现如下)

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

//前序(先序)创建二叉树
//先 中 后 遍历二叉树
//层序遍历(队列)
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef char BTElementype;//建立二叉树结点数据类型
typedef struct BTNode     //结点结构
{
    BTElementype data;
    struct BTNode *lchild, *rchild;
} BTNode, *BinTree;

typedef struct
{
    BinTree data[MAXSIZE];
    int front, rear;
}SqNode, *SqQueue;

int  PreCreateBinTree(BinTree *BT);//前序创建二叉树
void PreOrder(BinTree BT);//先序遍历
void InOrder(BinTree BT);//中序遍历
void PostOrder(BinTree BT);//后序遍历
void InitSqQueue(SqQueue Q);
int IsEmpty(SqQueue Q);
int IsEmpty(SqQueue Q);
int IsFull(SqQueue Q);
int EnSqQueue(SqQueue Q, BinTree e);
int DeSqQueue(SqQueue Q, BinTree *e);
int SequenceOrder(BinTree T);//层序遍历(也可以叫顺序遍历)


int main()
{
    BinTree BT;
    printf("利用递归算法创建前序二叉树,请出入接结点数据,空结点用#表示!\n");
    PreCreateBinTree(&BT);
    printf("\n");
    printf("二叉树的先序序列:\n");
    PreOrder(BT);
    printf("\n");
    printf("二叉树的中序序列:\n");
    InOrder(BT);
    printf("\n");
    printf("二叉树的后序序列:\n");
    PostOrder(BT);
    printf("\n");
    printf("二叉树的层序序列:\n");
    SequenceOrder(BT);
    printf("\n");

    return 0;
}
int  PreCreateBinTree(BinTree *BT)
{
    BTElementype ch;
    scanf("%c", &ch);
    if('#' == ch)
    {
        *BT = NULL;
    }
    else
    {
        *BT = (BinTree)malloc(sizeof(BTNode));
        if(!BT)
        {
            printf("动态内存分配失败!\n");
            return ERROR;
        }
        (*BT)->data = ch;
        PreCreateBinTree(&((*BT)->lchild));
        PreCreateBinTree(&((*BT)->rchild));
    }
    return OK;
}

void PreOrder(BinTree BT)
{
    if(BT)
    {
        printf("%c", BT->data);
        PreOrder(BT->lchild);
        PreOrder(BT->rchild);
    }
}

void InOrder(BinTree BT)
{
    if(BT)
    {
        InOrder(BT->lchild);
        printf("%c", BT->data);
        InOrder(BT->rchild);
    }
}
void PostOrder(BinTree BT)
{
    if(BT)
    {
        PostOrder(BT->lchild);
        PostOrder(BT->rchild);
        printf("%c", BT->data);
    }
}


void InitSqQueue(SqQueue Q)
{
    Q->front = 0;
    Q->rear = 0;
}

int IsEmpty(SqQueue Q)
{
    return (Q->front == Q->rear);
}

int IsFull(SqQueue Q)
{
    return ((Q->rear+1)%MAXSIZE == Q->rear);
}

int EnSqQueue(SqQueue Q, BinTree e)
{
    if(IsFull(Q))
    {
        printf("队列满!\n");
        return ERROR;
    }
    Q->data[Q->rear++] = e;
    return OK;
}

int DeSqQueue(SqQueue Q, BinTree *e)
{
    if(IsEmpty(Q))
    {
        printf("队列空!\n");
        return ERROR;
    }
    *e = Q->data[Q->front++];
    return OK;
}


int SequenceOrder(BinTree T)
{
    BinTree temp;
    SqQueue SQ;
    SQ = (SqQueue)malloc(sizeof(SqNode));
    if(!SQ)
    {
        printf("动态内存分配失败!\n");
        return ERROR;
    }
    InitSqQueue(SQ);
    EnSqQueue(SQ, T);
    while(!IsEmpty(SQ))
    {
        DeSqQueue(SQ,&temp);
        printf("%c", temp->data);
        if(temp->lchild)
        {
            EnSqQueue(SQ,temp->lchild);
        }
        if(temp->rchild)
        {
            EnSqQueue(SQ,temp->rchild);
        }
    }
    return OK;
}
大家如有什么问题可以提问!

猜你喜欢

转载自blog.csdn.net/weixin_41588502/article/details/80530063
今日推荐