目录
二叉树层序遍历
分析
思路
图解
手动创建二叉树
层序遍历实现?
队列的实现
衔接问题
注意事项
连接
?队列头文件改变? ???
二叉树层序遍历
即设根节点所在层数为1,从第一层开始,从上往下,每层从左往右遍历。
分析
层序遍历需要用到队列,用其先进先出的性质
思路
当根不为空时,将根节点入队,
保存根节点地址,访问其数据域,之后出队;
若根节点的左子树不为空,入队左子树,
判断根节点的右子树不为空,入队右子树,
保存队头节点地址,访问其数据域,之后出队;
重复上述过程的条件是队列不为空
图解
?层序遍历过程分析:
手动创建二叉树
//定义
//.h文件
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int BTDataType;
typedef struct BinaryTreeNode
{
BTDataType data;
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
}BTNode;
//test.c文件
//开辟结点
BTNode* BuyNode(BTDataType x)
{
BTNode* node = (BTNode*)malloc(sizeof(BTNode));
if (node == NULL)
{
printf("malloc fail\n");
exit(-1);
}
node->data = x;
node->left = NULL;
node->right = NULL;
return node;
}
//手动创建
BTNode* CreatBinaryTree()
{
BTNode* node1 = BuyNode(1);
BTNode* node2 = BuyNode(2);
BTNode* node3 = BuyNode(3);
BTNode* node4 = BuyNode(4);
BTNode* node5 = BuyNode(5);
BTNode* node6 = BuyNode(6);
BTNode* node7 = BuyNode(7);
node1->left = node2;
node1->right = node3;
node2->left = node4;
node2->right = node5;
node3->left = node6;
node3->right = node7;
return node1;
}
层序遍历实现?
// 层序遍历--使用队列
void LevelOrder(BTNode* root)
{
if (root == NULL)
{
return;
}
//不为空则创建队列,初始化
Queue q;
QueueInit(&q);
if (root)
{
QueuePush(&q, root);
}
//队列为空时,结束遍历
while (!QueueEmpty(&q))
{
//保存起始节点
BTNode* sta = QueueFront(&q);
printf("%d ",sta->data);
//出队--此时队头元素更新至下一位
QueuePop(&q);
//判断左右子树是否入队
if (sta->left)
{
QueuePush(&q, sta->left);
}
if (sta->right)
{
QueuePush(&q, sta->right);
}
}
//结束遍历记得销毁队列
QueueDestory(&q);
}
队列的实现
博客链接看这儿:?队列的实现_i跑跑的博客-CSDN博客
衔接问题
注意事项
入队元素不是二叉树结点的数据域,是整个二叉树节点
那么在改变队列元素类型的时候:
要求队列元素为二叉树节点类型的指针,来接收节点地址?
连接
我们测试文件.c中需包含二叉树.h文件
.c中要创建队列,我们将队列.h文件放入二叉树.h文件中即可
队列.h文件中,元素类型须变为二叉树结构体的指针类型
那么我们直接包含二叉树的.h文件不就行了吗?
不行,会出现struct类型重定义的问题
那么不用包含二叉树头文件,我的队列头文件要怎么样才能访问到二叉树的结构体类型呢?
结构体声明即可
struct BinaryTreeNode;
?队列头文件改变? ???
//Queue.h
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
//声明结构体类型
struct BinaryTreeNode;
//改变元素类型为该结构体类型的指针
typedef struct BinaryTreeNode* QDatatype;
//定义单链表结点
typedef struct QueueNode
{
QDatatype data;
struct QueueNode* next;
}QNode;
typedef struct Queue
{
QNode* head;
QNode* tail;
}Queue;
|