二叉树的层次遍历(配图详解)

二叉树的层次遍历

  层序遍历顾名思义就是一层一层的遍历的树中的所有结点。

typedef char EmpeType

在本篇文章中,将char类型使用EmpeType

typedef char EmpeType;

创建一个结构体

typedef struct BiTNode {
	EmpeType data;  //数据域
	struct BiTNode* lchild;   //左孩子
	struct BiTNode* rchild;   //右孩子
}BitNode;

快速创建一个树

首先我们进行快速创建一个二叉树。

在这里插入图片描述

//快速创建一个树
	BiTNode* A = (BiTNode*)malloc(sizeof(BiTNode));
	A->data = 'A';
	A->lchild = NULL;
	A->rchild = NULL;

	BiTNode* B = (BiTNode*)malloc(sizeof(BiTNode));
	B->data = 'B';
	B->lchild = NULL;
	B->rchild = NULL;

	BiTNode* C = (BiTNode*)malloc(sizeof(BiTNode));
	C->data = 'C';
	C->lchild = NULL;
	C->rchild = NULL;

	BiTNode* D = (BiTNode*)malloc(sizeof(BiTNode));
	D->data = 'D';
	D->lchild = NULL;
	D->rchild = NULL;

	BiTNode* E = (BiTNode*)malloc(sizeof(BiTNode));
	E->data = 'E';
	E->lchild = NULL;
	E->rchild = NULL;
	//快速创建A,B,C,D,E5个结点
	
	A->lchild = B;
	A->rchild = C;
	B->lchild = D;
	B->rchild = E;

层序遍历的核心代码

使用队列来进行辅助遍历

在这里插入图片描述
  首先,遍历二叉树的第一层A先入队,遍历完第一层的时候,然后A出队,并打印A 结点。
  当A出队的时候,遍历A的左孩子,此时A的左孩子不为NULL,将左孩子B入队,然后遍历A的右孩子,此时A的右孩子不为NULL,将右孩子C入队。
在这里插入图片描述
  开始遍历第二层B结点,此时B结点已经入队,将B结点出队,并打印B结点。
  当B出队的时候,遍历B的左孩子,此时B的左孩子不为NULL,将左孩子D入队,然后遍历B的右孩子,此时B的右孩子不为NULL,将右孩子E入队。

在这里插入图片描述
  开始遍历第二层C结点,此时C结点已经入队,将C结点出队,并打印C结点。
  当C出队的时候,遍历C的左孩子,此时C的左孩子为NULL,将NULL入队,相当于没有数据入队。然后遍历C的右孩子,此时C的右孩子为NULL,将NULL入队,相当于没有数据入队。

  根据同样的道理遍历结点D,E,直到队为空,完成所有遍历。

在这里插入图片描述

核心代码

/层序遍历(存的数据)
void LevelOrder(BiTNode* T)
{
	//创建一个队列
	queue<EmpeType> q;
	//用于存放队头
	EmpeType tmp = 0;
	if (T == NULL)
		return;
	//入队
	q.push(T->data);
	while (!q.empty())
	{
		//取出队的头元素
		tmp = q.front();
		cout << tmp << " ";
		if (T->lchild != NULL)
		{
		    //当左孩子不为空,则入队
			q.push(T->lchild->data);
		}
		if (T->rchild != NULL)
		{
			//当右孩子不为空,则入队
			q.push(T->rchild->data);
		}
		Sleep(1000);
		//出队
		if (T->lchild != NULL)
		{
			T = T->lchild;
		}
		else if (T->rchild != NULL)
		{
			T = T->rchild;
		}
		//弹出队头元素
		q.pop();
	}
}

源代码 队中存数据

#include<iostream>
using namespace std;
#include<queue>
#include<windows.h>

typedef char EmpeType;
typedef struct BiTNode {
	EmpeType data;  //数据域
	struct BiTNode* lchild;   //左孩子
	struct BiTNode* rchild;   //右孩子
}BitNode;

//层序遍历(存的数据)
void LevelOrder(BiTNode* T)
{
	//创建一个队列
	queue<EmpeType> q;
	//用于存放队头
	EmpeType tmp = 0;
	if (T == NULL)
		return;
	//入队
	q.push(T->data);
	while (!q.empty())
	{
		//取出队的头元素
		tmp = q.front();
		cout << tmp << " ";
		if (T->lchild != NULL)
		{
		    //当左孩子不为空,则入队
			q.push(T->lchild->data);
		}
		if (T->rchild != NULL)
		{
			//当右孩子不为空,则入队
			q.push(T->rchild->data);
		}
		Sleep(1000);
		//出队
		if (T->lchild != NULL)
		{
			T = T->lchild;
		}
		else if (T->rchild != NULL)
		{
			T = T->rchild;
		}
		//弹出队头元素
		q.pop();
	}
}


int main()
{
	//快速创建一个树
	BiTNode* A = (BiTNode*)malloc(sizeof(BiTNode));
	A->data = 'A';
	A->lchild = NULL;
	A->rchild = NULL;

	BiTNode* B = (BiTNode*)malloc(sizeof(BiTNode));
	B->data = 'B';
	B->lchild = NULL;
	B->rchild = NULL;

	BiTNode* C = (BiTNode*)malloc(sizeof(BiTNode));
	C->data = 'C';
	C->lchild = NULL;
	C->rchild = NULL;

	BiTNode* D = (BiTNode*)malloc(sizeof(BiTNode));
	D->data = 'D';
	D->lchild = NULL;
	D->rchild = NULL;

	BiTNode* E = (BiTNode*)malloc(sizeof(BiTNode));
	E->data = 'E';
	E->lchild = NULL;
	E->rchild = NULL;

	A->lchild = B;
	A->rchild = C;
	B->lchild = D;
	B->rchild = E;



	LevelOrder(A);
	return 0;
}

运行结果

在这里插入图片描述

源代码2 队中存地址

#include<iostream>
using namespace std;
#include<queue>
#include<windows.h>


typedef char BitEmpeType;
typedef struct BiTNode {
	BitEmpeType data;
	struct BiTNode* lchild;
	struct BiTNode* rchild;
}BitNode;
typedef BiTNode* QEmpeType;


//层序遍历(队中存的指针)
void LevelOrder(BiTNode* T)
{
	//创建一个队列
	queue<QEmpeType> q;
	//用于存放队头
	BitEmpeType tmp = 0;
	if (T == NULL)
		return;
	//入队
	q.push(T);
	while (!q.empty())
	{
		tmp = q.front()->data;
		//打印
		cout << tmp << " ";
		if (q.front()->lchild != NULL)
		{
			q.push(q.front()->lchild);
		}
		if (q.front()->rchild != NULL)
		{
			q.push(q.front()->rchild);
		}
		Sleep(1000);
		//出队
		q.pop();
	}
}

int main()
{
	//快速创建一个树
	BiTNode* A = (BiTNode*)malloc(sizeof(BiTNode));
	A->data = 'A';
	A->lchild = NULL;
	A->rchild = NULL;

	BiTNode* B = (BiTNode*)malloc(sizeof(BiTNode));
	B->data = 'B';
	B->lchild = NULL;
	B->rchild = NULL;

	BiTNode* C = (BiTNode*)malloc(sizeof(BiTNode));
	C->data = 'C';
	C->lchild = NULL;
	C->rchild = NULL;

	BiTNode* D = (BiTNode*)malloc(sizeof(BiTNode));
	D->data = 'D';
	D->lchild = NULL;
	D->rchild = NULL;

	BiTNode* E = (BiTNode*)malloc(sizeof(BiTNode));
	E->data = 'E';
	E->lchild = NULL;
	E->rchild = NULL;

	A->lchild = B;
	A->rchild = C;
	B->lchild = D;
	B->rchild = E;



	LevelOrder(A);
	return 0;
}

在这里插入图片描述

觉得我回答有用的话,记得点个关注哟!谢谢支持!

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

君生我老

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值