以下代码包含了二叉树的部分基本操作,包括(递归创建二叉树,层序遍历二叉树,递归先中后序遍历二叉树)几种操作。
1.结构体类型代码块
typedef struct TreeNode//树节点
{
struct TreeNode* lchild,* rchild;
char data;
}TreeNode;
typedef struct QueueNode//队列节点
{
TreeNode* data;
struct QueueNode* next;
}QueueNode;
typedef struct Queue//队列
{
QueueNode* front,*rear;
}Queue;
2.初始化队列
Queue* initQ(Queue* pq)//建立只有头结点的队列
{
pq->front = (QueueNode*)malloc(sizeof(QueueNode));
if (pq->front==NULL)//判断内存分配是否成功
{
printf("内存分配不成功");
}
else
{
pq->front->next = NULL;//队列的front和rear的next初始化为空
pq->rear = pq->front;
return pq;
}
}
3.进队
void enqueue(Queue* pq, TreeNode* t)//把二叉树的数据取出放入队列
{
QueueNode* pNew = new QueueNode;
pNew->data = t;//二叉树的数据存入队列
pNew->next = NULL;
pq->rear->next = pNew;//尾插法建立连接
pq->rear = pNew;//rear更新
}
4.出队
TreeNode* dequeue(Queue* pq)//出队:删除队列第一个元素
{
QueueNode* Temp= (QueueNode*)malloc(sizeof(QueueNode));
Temp = pq->front->next;
if (Temp->next == NULL)//只剩下1个节点(不含队列空的头结点)
{
pq->rear = pq->front;
}
else{
pq->front->next = Temp->next;//front+1(从指向第1个非空节点改为指向第2个节点)
}
TreeNode* x;
x= Temp->data;//x为队列第一个元素的data
free(Temp);
return x;
}
5.先序递归创建二叉树
void createTree(TreeNode*& t)//创建树,&引用已经定义的t
{
char ch;
scanf("%c",&ch);
if (ch == '#')//如果输入*则为空
{
t = NULL;
}
else
{
t = new TreeNode;
t->data = ch;
createTree(t->lchild);//递归
createTree(t->rchild);
}
}
6.层序遍历
void LevelOrderBiTree(TreeNode* t)//层序
{
Queue* pq= (Queue*)malloc(sizeof(Queue));
pq = initQ(pq);
enqueue(pq,t);//取出二叉树的根节点,子节点存入队列
while (pq->rear != pq->front)//当队列不为空
{
TreeNode* x = dequeue(pq);//x用于输出队列弹出元素的数据
printf("%c", x->data);
if (x->lchild!=NULL)
{
enqueue(pq, x->lchild);//递归左节点
}
if (x->rchild!=NULL)
{
enqueue(pq, x->rchild);//递归右节点
}
}
}
7.前中后递归遍历
//先序遍历
void preOrder(TreeNode* t){
if(t){
printf("%c ",t->data);
preOrder(t->lchild);
preOrder(t->rchild);
}
}
//中序遍历
void InOrder(TreeNode* t){
if(t){
preOrder(t->lchild);
printf("%c ",t->data);
preOrder(t->rchild);
}
}
//后序遍历
void postOrder(TreeNode* t){
if(t){
preOrder(t->lchild);
preOrder(t->rchild);
printf("%c ",t->data);
}
}
完整代码
#include<stdio.h>
#include<stdlib.h>
//层序遍历二叉树
typedef struct TreeNode//树节点
{
struct TreeNode* lchild,* rchild;
char data;
}TreeNode;
typedef struct QueueNode//队列节点
{
TreeNode* data;
struct QueueNode* next;
}QueueNode;
typedef struct Queue//队列
{
QueueNode* front,*rear;
}Queue;
void createTree(TreeNode*& t)//创建树,&引用已经定义的t
{
char ch;
scanf("%c",&ch);
if (ch == '#')//如果输入*则为空
{
t = NULL;
}
else
{
t = new TreeNode;
t->data = ch;
createTree(t->lchild);//递归
createTree(t->rchild);
}
}
Queue* initQ(Queue* pq)//建立只有头结点的队列
{
pq->front = (QueueNode*)malloc(sizeof(QueueNode));
if (pq->front==NULL)//判断内存分配是否成功
{
printf("内存分配不成功");
}
else
{
pq->front->next = NULL;//队列的front和rear的next初始化为空
pq->rear = pq->front;
return pq;
}
}
void enqueue(Queue* pq, TreeNode* t)//把二叉树的数据取出放入队列
{
QueueNode* pNew = new QueueNode;
pNew->data = t;//二叉树的数据存入队列
pNew->next = NULL;
pq->rear->next = pNew;//尾插法建立连接
pq->rear = pNew;//rear更新
}
TreeNode* dequeue(Queue* pq)//出队:删除队列第一个元素
{
QueueNode* Temp= (QueueNode*)malloc(sizeof(QueueNode));
Temp = pq->front->next;
if (Temp->next == NULL)//只剩下1个节点(不含队列空的头结点)
{
pq->rear = pq->front;
}
else{
pq->front->next = Temp->next;//front+1(从指向第1个非空节点改为指向第2个节点)
}
TreeNode* x;
x= Temp->data;//x为队列第一个元素的data
free(Temp);
return x;
}
void LevelOrderBiTree(TreeNode* t)//层序
{
Queue* pq= (Queue*)malloc(sizeof(Queue));
pq = initQ(pq);
enqueue(pq,t);//取出二叉树的根节点,子节点存入队列
while (pq->rear != pq->front)//当队列不为空
{
TreeNode* x = dequeue(pq);//x用于输出队列弹出元素的数据
printf("%c", x->data);
if (x->lchild!=NULL)
{
enqueue(pq, x->lchild);//递归左节点
}
if (x->rchild!=NULL)
{
enqueue(pq, x->rchild);//递归右节点
}
}
}
//先序遍历
void preOrder(TreeNode* t){
if(t){
printf("%c ",t->data);
preOrder(t->lchild);
preOrder(t->rchild);
}
}
//中序遍历
void InOrder(TreeNode* t){
if(t){
preOrder(t->lchild);
printf("%c ",t->data);
preOrder(t->rchild);
}
}
//后序遍历
void postOrder(TreeNode* t){
if(t){
preOrder(t->lchild);
preOrder(t->rchild);
printf("%c ",t->data);
}
}
int main()
{
TreeNode* t;
printf("请输入二叉树数据:");
createTree(t);
printf("层序遍历: ");
LevelOrderBiTree(t);
printf("\n先序遍历: ");
preOrder(t);
printf("\n中序遍历: ");
InOrder(t);
printf("\n后序遍历: ");
postOrder(t);
return 0;
}
总结:
以上就是今天要讲的内容,本文仅仅简单介绍了二叉树的部分基本操作,本贴为博主亲手整理。如有错误,请评论区指出,一起进步。谢谢大家的浏览.