二叉树的层序遍历(C语言实现)

文章介绍了如何使用C语言实现二叉树的层序遍历,主要思想是借助辅助循环队列,通过入队和出队操作,先访问根节点,再依次访问其子节点。代码中包含了队列的数据结构定义、初始化、判断队列为空、入队和出队等函数,以及二叉树的创建和层序遍历函数。
摘要由CSDN通过智能技术生成

二叉树的层序遍历

这是库存,以前写的。

一、思想

要进行二叉树的层序遍历,需要借助一个辅助队列实现。首先将二叉树的根结点入队,然后出队,访问出队结点,若它有左子树,则将左子树根结点入队;若它有右子树,将右子树根结点入队。然后出队,访问出队结点…如此反复,直到队列为空。(参考王道书)

二、代码实现

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 10
 
typedef struct BNode {
	int data;	//数据域
	struct BNode* lchild;		//左孩子
	struct BNode* rchild;		//右孩子 
}*BiTree,BNode;

//循环队列的数据结构
typedef struct CirSqueue
{
	BiTree data[MaxSize]; //队列最大容量为MaxSize
	int front,rear;
}CirSqueue;
 
//初始化
void Initqueue(CirSqueue *Q)
{
	Q->front = Q->rear = 0;
}

//判断队列是否为空
int QueueEmpty(CirSqueue Q)
{
	return Q.front == Q.rear;
}

//入队
void EnQueue(CirSqueue *Q, int x)
{
	if ((Q->rear + 1) % MaxSize == Q->front)
	{
		printf("队满!\n");
		return;
	}
	Q->data[Q->rear] = x;
	Q->rear = (Q->rear + 1) % MaxSize;
}
//出队
void OutQueue(CirSqueue *Q)
{
	Q->front = (Q->front + 1) % MaxSize;
}
 
BiTree CreateBinTree()
{
	int data;
	int temp;
	BiTree T;
 
	scanf("%d", &data);		//	输入数据
	temp = getchar();			//吸收空格
 
	if (data == -1) {			//输入-1 代表此节点下子树不存数据,也就是不继续递归创建
		return NULL;
	}
	else {
		T = (BiTree)malloc(sizeof(BNode));			//		分配内存空间
		T->data = data;								//		把当前输入的数据存入当前节点指针的数据域中
 
		printf("请输入%d的左子树: ", data);
		T->lchild = CreateBinTree();					//		开始递归创建左子树
		printf("请输入%d的右子树: ", data);
		T->rchild = CreateBinTree();					//		开始到上一级节点的右边递归创建左右子树
		return T;							//		返回根节点
	}
 
}

//层序遍历需要借助队列来实现 
void levelOrder(BiTree T)
{
	CirSqueue Q;
	Initqueue(&Q);
	EnQueue(&Q,T);//根节点入队 
	
	BiTree P;
	while (!QueueEmpty(Q))
	{
		printf("%d ",Q.data[Q.front]->data);//访问队头元素 
		P = Q.data[Q.front];
		OutQueue(&Q);//出队 
		if(P->lchild!=NULL)
			EnQueue(&Q, P->lchild);//左子树不空则入队 
		if(P->rchild!=NULL)
			EnQueue(&Q, P->rchild);//右子树不空则入队 
	}
}
 
 
int main()
{
	BiTree T;
	printf("请输入第一个节点的数据:\n");
	T = CreateBinTree();			//		接受创建二叉树完成的根节点
	printf("\n层次遍历结果: \n");
	levelOrder(T);
	return 0;
}

三、测试结果

注意,保存代码时要以 .c 为后缀,而不是.cpp后缀。
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值