数据结构: 递归先序创建二叉树及其先序,中序和后序遍历
递归先序创建二叉树及其先序,中序和后序遍历:
(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;
}
大家如有什么问题可以提问!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)