二叉树的层序遍历

目录

二叉树层序遍历

分析

思路

图解

手动创建二叉树

层序遍历实现 

队列的实现

衔接问题

注意事项

连接

 队列头文件改变     


二叉树层序遍历

即设根节点所在层数为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;
  • 60
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 44
    评论
评论 44
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

今年依旧去年春

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

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

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

打赏作者

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

抵扣说明:

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

余额充值