递归创建二叉树及遍历

以下代码包含了二叉树的部分基本操作,包括(递归创建二叉树,层序遍历二叉树,递归先中后序遍历二叉树)几种操作。

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;
}

总结:
        以上就是今天要讲的内容,本文仅仅简单介绍了二叉树的部分基本操作,本贴为博主亲手整理。如有错误,请评论区指出,一起进步。谢谢大家的浏览.

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值