当前位置: 首页 > article >正文

【数据结构】二叉树——层序遍历

层序遍历

  • 一、层序遍历
  • 二、层序遍历(递归)
  • 三、层序遍历(非递归)
  • 四、总结

一、层序遍历

层序遍历是一种广度优先遍历
在这里插入图片描述
以图上二叉树为例,层序遍历就是按照二叉树的深度一层一层进行遍历
遍历顺序:

A B C D E F G H

二、层序遍历(递归)

若用递归方式解决层序遍历
我们可以先算出二叉树的深度
然后按照不同深度 k 进行遍历
每次向下遍历就 k–
当 k == 1 时就是第 k 层的数据
以此来实现层序遍历

//层序遍历(1)
//(先写一个可以遍历某一层的函数,再循环遍历每一层)

//某一层遍历
void BTLevelkOrder(BTNode* php, int k)
{
	if (php == NULL || k == 0)
	{
		return;
	}
	if (k == 1)
	{
		printf("%c ", php->val);
	}
	BTLevelkOrder(php->left, k - 1);
	BTLevelkOrder(php->right, k - 1);
}
//层序遍历二叉树
void BTLevelOrder(BTNode* php)
{
	if (php == NULL)
	{
		return;
	}
	int dep = BTLevelDepth(php);
	for (int i = 1; i <= dep; i++)
	{
		BTLevelkOrder(php, i);
	}
}

在这里插入图片描述

三、层序遍历(非递归)

若要用非递归的方式来解决层序遍历
我们先将根节点入队列
然后将根节点出队列,并将该根节点的左右节点人队列
重复该过程,直到队列为空
队列的代码

在这里插入图片描述

在这里插入图片描述

//层序遍历(2)
//将节点地址依次入队列
void BTLevelOrder(BTNode* php)
{
	//创建队列
	Queue p;
	QueueInit(&p);

	//先将根入队列
	if(php)
		QueuePush(&p, php);

	while (!QueueEmpty(&p))
	{
		//将根位置节点出队列
		QueueDateType cp = QueueFront(&p);
		QueuePop(&p);

		//打印出队列节点的数据
		printf("%c ", cp->val);

		//左右节点不为空入队列
		if (cp->left)
		{
			QueuePush(&p, cp->left);
		}

		if (cp->right)
		{
			QueuePush(&p, cp->right);
		}
	}
	//队列销毁
	QueueDesTroy(&p);
}

在这里插入图片描述

四、总结

上面我们学习了递归与非递归的方式去对二叉树进行层序遍历
我们发现递归的代码简介,而且好理解
那我们为什么不用递归而会去研究非递归的方式呢?
因为我们的递归过程会重复调用函数,就会在栈上开辟空间
而栈中空间大小是有限的
若我们的递归深度太深就会有栈溢出的风险
而非递归方式开辟的队列是在堆中开辟的空间会大很多
一般不会出现空间被占满的情况


http://www.kler.cn/a/383184.html

相关文章:

  • 【杂谈】-为什么Python是AI的首选语言
  • Vue 92 ,Element 15 ,Vue + el-upload 实现图片上传与管理
  • 初学stm32 --- NVIC中断
  • Matlab个性化绘图第6期—带标记面的三维折线图
  • 基于python+django的外卖点餐系统
  • 贪心算法 part01
  • HTML5+css3(伪类,动态伪类,结构伪类,否定伪类,UI伪类,语言伪类,link,hover,active,visited,focus)
  • 网络优化如何利用改IP软件解除地域限制
  • VBA02-初识宏——EXCEL录像机
  • Windows核心编程笔记——DLL基础
  • 【AI视频换脸整合包及教程】AI换脸新星:Rope——让换脸变得如此简单
  • LeetCode题练习与总结:O(1) 时间插入、删除和获取随机元素 - 允许重复--381
  • Air780E基于LuatOS编程开发
  • web实操3——servlet
  • 短剧APP系统开发,数字化微短剧时代
  • SpringBoot框架学习总结 及 整合 JDBC Mybatis-plus JPA Redis 我的学习笔记
  • 《Qwen2-VL》论文精读【下】:发表于2024年10月 Qwen2-VL 迅速崛起 | 性能与GPT-4o和Claude3.5相当
  • 《Java 实现选择排序:原理剖析与代码详解》
  • 手动切换python版本
  • yolov8涨点系列之Concat模块改进
  • 300公斤载重橡胶履带式无人车底盘技术详解
  • AUTOSAR CP NVRAM Manager规范导读
  • Angular 中 UntypedFormGroup和FormGroup的区别?
  • 【python】游戏设计 --- 双人井字棋小游戏
  • OceanBase中,如何解读 obdiag 收集的火焰图 【DBA早下班系列】
  • 刷题强训 (day1) -- 数字统计