二叉树的层次遍历
层序遍历顾名思义就是一层一层的遍历的树中的所有结点。
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;
}
觉得我回答有用的话,记得点个关注哟!谢谢支持!