数据结构 二叉树(3)---层序遍历二叉树

在上篇文章中我们主要讲了关于实现二叉树的内容,包括遍历二叉树,以及统计二叉树等内容。而

在这篇文章中我们将详细讲解一下利用队列的知识实现层序遍历二叉树。

那么层序遍历是什么?以及利用队列遍历二叉树又是怎么遍历的?下面让我们一起带着这些问题深

入研究:

1. 什么是层序遍历?

我们仍然以之前使用过的二叉树为例。

对于二叉树而言 : 层序遍历二叉树,简单说就是按“层次”访问节点:从根节点开始,先访问第1层

(根),再访问第2层(根的左右孩子),接着第3层……逐层从左到右访问每个节点,直到所有节

点都被访问。所以对于这棵二叉树而言,我们可以简单的推论出这棵二叉树的层序遍历就是 : A  B

C  D  NULL  E  F  NULL  NULL  NULL  NULL  NULL  NULL

2. 为什么要使用队列实现层序遍历二叉树?

用队列实现这棵二叉树的层序遍历,核心就是利用了队列“先进先出”的特性,刚好匹配层序遍历

“一层一层、从左到右”的需求。

3.怎样使用队列实现层序遍历二叉树呢?


利用队列实现二叉树层序遍历,核心是用队列存储节点和借助队列 “先进先出” 的特性,让二叉树

节点按 “一层一层、从左到右” 的顺序被访问,具体逻辑可拆解为 3 步:

1. 核心原理:队列如何适配层序需求

二叉树层序遍历要 “按层访问”,但二叉树节点靠指针( left / right )关联,本身无 “层” 的显式顺

序。队列的 “先进先出” 特性,能把二叉树的 “层次顺序” 转化为队列的 “线性顺序”:

- 处理当前层节点时,把下一层节点(左右子节点)按顺序入队 → 保证下一层节点会 “排队等

待”,按入队顺序被处理(契合层序 “从左到右、一层一层” 的规则)。

2. 队列的 “先进先出” 完美匹配层序遍历需求:

- “先进”:处理当前层节点时,优先把下一层的左子节点入队(保证层序 “从左到右”)。

- “先出”:队列头部始终是 “当前层最早入队的节点”,处理完弹出 → 保证层序 “一层一层” 推进。

对比其他结构(如栈):若用栈(后进先出),节点处理顺序会混乱,无法实现 “按层访问”。因

此,队列是层序遍历的 “最佳搭档”,用其特性弥补了二叉树层次顺序的隐式问题。

简单说,队列是层序遍历的 “工具”:用它的 “排队逻辑”,把二叉树的层次关系转化为可顺序处理的

线性结构,让层序遍历从抽象需求落地成代码逻辑 。

4. 代码的实现

层序遍历函数( levelOrder ):

void levelOrder(BTNode* root)
{Queue q;QueueInit(&q);QueuePush(&q, root);while (!QueueEmpty(&q)){//取队头,出对头BTNode* top = QueueFront(&q);QueuePop(&q);printf("%c ", top->data);//将对头非空左右孩子入队列if (top->left){QueuePush(&q, top->left);}if (top->right){QueuePush(&q, top->right);}}QueueDestroy(&q);  
}

以下从层序遍历逻辑和队列与二叉树的关系两方面详细讲解:

层序遍历核心是按“一层一层”的顺序访问二叉树节点,借助队列实现,步骤如下:

1. 初始化队列

Queue q;
QueueInit(&q);
QueuePush(&q, root); 

- 先创建队列  q  并初始化,再把二叉树根节点 root 入队。此时队列里只有根节点,是层序遍历的

起点。

2. 循环处理队列(核心逻辑)

while (!QueueEmpty(&q)) 
{BTNode* top = QueueFront(&q); // 取队头(当前层节点)QueuePop(&q);                 // 弹出队头(处理完当前节点,出队)printf("%c ", top->data);     // 访问节点数据(打印,也可做其他操作)// 非空左右孩子入队(为下一层遍历做准备)if (top->left)  QueuePush(&q, top->left);  if (top->right) QueuePush(&q, top->right); 
}

- 循环条件:队列非空时,持续处理节点(队列空说明所有层遍历完毕)。

- 取节点 & 出队: QueueFront  拿到当前层的节点(队头), QueuePop  把它移出队列(因为要

处理该节点的逻辑了)。

- 访问节点:通过  top->data  访问当前节点数据(比如打印)。

- 子节点入队:若当前节点的左、右孩子非空,依次入队——这是层序遍历的关键!保证下一层节

点按顺序排队,后续循环会按“先入先出”处理,自然实现“一层一层”遍历。

3. 队列与二叉树的关系

层序遍历中,队列是“桥梁”,用“先入先出”特性适配二叉树“一层一层访问”的需求,具体关系体现

在:

1. 队列的作用:“暂存 + 顺序控制”

- 暂存节点:遍历某一层时,把当前层节点的非空左右孩子入队,这些孩子属于“下一层节点”。

- 顺序控制:队列保证节点“先进先出”,契合层序遍历“从左到右、一层一层”的顺序。比如根节点先

入队,处理根节点时,左、右孩子入队;后续先处理左孩子(队头),再处理右孩子(队列里排队

的),完美匹配层序遍历逻辑。

2. 二叉树结构对队列的依赖

二叉树节点是“分散”的(通过指针关联左右孩子),无法直接按“层”遍历。队列通过“入队(记录

下一层节点)→ 出队(处理当前层节点)”的流程,把二叉树“分层”的逻辑,转化为队列的“线性顺

序”操作,让层序遍历可实现。

4. 总结:

层序遍历函数用队列实现“分层访问”,队列的“先入先出”特性,完美匹配二叉树“一层一层遍历”的需

求:

- 队列暂存“下一层节点”,保证遍历顺序;

- 二叉树的“分层逻辑”,通过队列转化为简单的“入队 → 出队 → 处理”流程

4. 函数中用到的队列相关函数及其作用

假设队列的底层实现为“链式队列”,以下是各函数的功能说明:

1.  QueueInit(&q) 

- 作用:初始化队列  q ,通常包括设置队头/队尾指针为  NULL 、初始化节点数量等,确保队列可

正常使用。

2.  QueuePush(&q, root) 

- 作用:将节点  root  插入队列尾部(入队操作),保持“先进先出”的顺序。

- 层序遍历中,用于将当前节点的左右子节点加入队列,作为下一层的待处理节点。

3.  QueueEmpty(&q) 

- 作用:判断队列是否为空(返回  true  或  false )。

- 作为循环终止条件:当队列为空时,说明所有节点已遍历完毕。

4.  QueueFront(&q) 

- 作用:获取队列的队头节点(不删除节点),返回节点指针。

- 层序遍历中,用于获取当前层的待访问节点。

5.  QueuePop(&q) 

- 作用:删除队列的队头节点(出队操作)。

- 层序遍历中,处理完队头节点后将其移除,避免重复访问。

6.  QueueDestroy(&q) 

- 作用:销毁队列,释放队列占用的所有内存(包括所有节点)。

- 必须在遍历结束后调用(原代码放在循环内是错误的,会导致第一次循环后队列被销毁,后续操

作失败)。

注意 : 上面关于队列的函数小编均在之前的文章中都有讲过。想深入了解的小伙伴可以去看一看。

并且上面的代码都是基于队列和二叉树的代码基础上实现。

5. 总结:

levelOrder  函数通过队列实现二叉树层序遍历,核心总结如下:

1. 初始化队列并将根节点入队,作为遍历起点;

2. 循环处理队列(队列非空时):

- 取出队头节点,访问其数据(打印);

- 将该节点的非空左右子节点依次入队(为下一层遍历做准备);

3. 遍历结束后销毁队列

简言之,队列的“先进先出”特性保证了节点按“一层一层、从左到右”的顺序被访问,是层序遍历的

关键工具。

以上便是关于队列实现层序遍历二叉树的全部内容。最后感谢大家的观看!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/90596.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90596.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【橘子分布式】gRPC(番外篇-拦截器)

一、简介 我们之前其实已经完成了关于grpc的一些基础用法,实际上还有一些比较相对进阶的使用方式。比如: 拦截器:包括客户端和服务端的拦截器,进而在每一端都可以划分为流式的拦截器和非流式的拦截器。和以前我们在spring web中的…

深入探索嵌入式仿真教学:以酒精测试仪实验为例的高效学习实践

引言:嵌入式技术普及下的教学革新 嵌入式系统作为现代科技的核心驱动力,其教学重要性日益凸显。然而,传统硬件实验面临设备成本高、维护难、时空受限等挑战。如何突破这些瓶颈,实现高效、灵活、专业的嵌入式教学?本文将…

三种深度学习模型(GRU、CNN-GRU、贝叶斯优化的CNN-GRU/BO-CNN-GRU)对北半球光伏数据进行时间序列预测

代码功能 该代码实现了一个光伏发电量预测系统,采用三种深度学习模型(GRU、CNN-GRU、贝叶斯优化的CNN-GRU/BO-CNN-GRU)对北半球光伏数据进行时间序列预测对北半球光伏数据进行时间序列预测,并通过多维度评估指标和可视化对比模型性…

PostgreSQL对象权限管理

本文记述在postgreSQL中对用户/角色操作库、模式、表、序列、函数、存储过程的权限管理针对数据库的授权 授权:grant 权限 on database 数据库 to 用户/角色; 撤权:revoke 权限 on database 数据库 from 用户/角色; 针对模式的授权 授权:gran…

Wordpress主题配置

一、下载主题 主题下载地址:https://www.iztwp.com/tag/blog-theme 二、主题安装 三、上传主题安装即可 四、安装完成启动主题

lock 和 synchronized 区别

1. 引言 在多线程编程中,我们经常需要确保某些代码在同一时刻只由一个线程执行。这种机制通常叫做“互斥锁”或“同步”。Java 提供了两种主要的同步机制:synchronized 关键字和 Lock 接口。尽管它们的作用相似,都用于实现线程的同步&#xf…

Tkinter - Python图形界面开发指南

作者:唐叔在学习 专栏:唐叔学python 标签:Python GUI编程 Tkinter教程 图形界面开发 Python实战 界面设计 事件监听 Python入门 唐叔Python 编程学习 软件开发 文章目录一、Tkinter是什么?为什么选择它?二、Tkinter基础…

Java基础day15

目录 一、Java集合简介 1.什么是集合? 2.集合接口 3.小结 二、List集合 1.List集合简介 三、ArrayList容器类 1.初始化 1.1无参初始化 1.2有参初始化 2.数据结构 3.常用方法 3.1增加元素 3.2查找元素 3.3 修改元素 3.4 删除元素 3.5 其他方法 4.扩…

React Three Fiber 实现昼夜循环:从光照过渡到日月联动的技术拆解

在 3D 场景中用 React Three Fiber 实现自然的昼夜循环,核心难点在于光照的平滑过渡、日月运动的联动逻辑、昼夜状态下的光影差异处理,以及性能与视觉效果的平衡。本文以一个 ReactThree.js 的实现为例,详细解析如何通过三角函数计算日月位置…

进阶向:基于Python的简易屏幕画笔工具

用Python打造你的专属屏幕画笔工具:零基础也能轻松实现你是否曾在观看网课或参加远程会议时,想要直接在屏幕上标注重点?或者作为设计师,需要快速绘制创意草图?现在,只需几行Python代码,你就能轻…

Elasticsearch-ik分析器

CLI 安装步骤 1、停止 Elasticsearch(如果正在运行): 在安装插件之前,确保 Elasticsearch 没有在运行。 命令: systemctl stop elasticsearch2、安装插件: 使用 elasticsearch-plugin 命令安装 IK 插件。进…

MySQL八股篇

查询关键字执行先后顺序FROM(及 JOIN)WHEREGROUP BYHAVINGSELECTDISTINCTORDER BYLIMIT / OFFSETCHAR 和 VARCHAR 的区别?使用场景?特性CHARVARCHAR​存储方式​​定长,存储时填充空格至定义长度变长,存储实际数据 长…

QT RCC 文件

RCC (Qt Resource Compiler) 是 Qt 框架中的一个工具,用于将资源文件(如图像、音频、翻译文件等)编译成二进制格式,并嵌入到应用程序可执行文件中。RCC 文件基本概念作用:将应用程序所需的资源文件编译成 C 代码&#…

数据湖典型架构解析:2025 年湖仓一体化解决方案

数据湖架构概述:从传统模型到 2025 年新范式数据湖作为存储海量异构数据的中央仓库,其架构设计直接影响企业数据价值的释放效率。传统数据湖架构主要关注数据的存储和管理,而 2025 年的数据湖架构已经演变为更加智能化、自动化的综合性数据平…

绘图库 Matplotlib Search

关于Pathon的绘图库的认识和基本操作的学习 这里学习了两款常用便捷的绘图库去学习使用Matplotlib介绍是最受欢迎的一种数据可视化包 是常用的2D绘图库 一般常于Numpy和Pandas使用 是数据分析中非常重要的工具可以自定义XY轴 绘制线形图 柱状图 直方图 密度图 散点图 更清晰的展…

Docker详解及实战

🎉 Docker 简介和安装 - Docker 快速入门 Docker 简介 Docker是一个开源的平台,用于开发、交付和运行应用程序。它能够在Windows,macOS,Linux计算机上运行,并将某一应用程序及其依赖项打包至一个容器中,这…

嵌入式学习的第三十三天-进程间通信-UDP

一、网络1.定义不同主机间进程通信主机间在硬件层面互联互通主机在软件层面互联互通2.国际网络体系结构OSI模型(7层): open system interconnect -------理论模型------定义了网络通信中不同层的协议1977 国际标准化组织各种不同体系结构的计算机能在世…

4、Spring AI_DeepSeek模型_结构化输出

一、前言 Spring AI 提供跨 AI 供应商(如 OpenAI、Hugging Face 等)的一致性 API, 通过分装的ChatModel或ChatClient即可轻松调动LLM进行流式或非流式对话。 本专栏主要围绕着通过OpenAI兼容接口调用各种大语言模型展开学习(因为大部分模型…

Spring Data Redis 从入门到精通:原理与实战指南

一、Redis 基础概念 Redis(Remote Dictionary Server)是开源的内存键值对数据库,以高性能著称。它支持多种数据结构(String、Hash、List、Set、ZSet),并提供持久化机制(RDB、AOF)。 …

免费版酒店押金原路退回系统——仙盟创梦IDE

项目介绍​东方仙盟开源酒店押金管理系统是一款面向中小型酒店、民宿、客栈的轻量级前台管理工具,专注于简化房态管理、订单处理和押金跟踪流程。作为完全开源的解决方案,它无需依赖任何第三方服务,所有数据存储在本地浏览器中,确…