从HC08监控模式到HCS08/RS08 BDM:嵌入式调试架构的演进与实战
2026/6/8 17:29:56
不同于前序、中序、后序遍历的 “深度优先” 思路(沿着一条路径走到头再回溯),层序遍历的核心是 “广度优先”:先访问根节点所在的第一层,再依次访问第二层的所有节点,接着是第三层…… 直到遍历完所有层级。
要实现这种 “逐层访问” 的逻辑,关键在于借助队列(Queue)这一数据结构。队列的 “先进先出(FIFO)” 特性,恰好能满足 “先访问的节点,其左右子节点也先入队、先被访问” 的需求:
以下是基于 C++ 实现的二叉树层序遍历代码,我们将逐行拆解核心逻辑:
cpp
运行
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: vector<vector<int>> levelOrder(TreeNode* root) { // 存储最终结果,每一个子数组对应一层的节点值 vector<vector<int>> result; // 空树直接返回空结果,避免后续无效操作 if (root == nullptr) return result; // 队列存储待遍历的节点,核心数据结构 queue<TreeNode*> q; // 根节点入队,作为遍历的起点 q.push(root); // 队列非空时,说明还有未遍历的节点 while (!q.empty()) { // 关键:记录当前层的节点数量(队列此时的大小即为当前层节点数) int levelSize = q.size(); // 存储当前层的所有节点值 vector<int> currentLevel; // 遍历当前层的所有节点 for (int i = 0; i < levelSize; i++) { // 取出队列头部节点(当前层的下一个节点) TreeNode* node = q.front(); q.pop(); // 记录当前节点值到当前层的结果中 currentLevel.push_back(node->val); // 左子节点非空则入队,为下一层遍历做准备 if (node->left != nullptr) { q.push(node->left); } // 右子节点非空则入队,保持“左到右”的顺序 if (node->right != nullptr) { q.push(node->right); } } // 将当前层的结果加入最终结果集 result.push_back(currentLevel); } return result; } };while循环时,队列的大小恰好等于当前层的节点数量 —— 这是实现 “分层” 的关键。levelSize = q.size()这一行是整个代码的精髓。因为进入while循环时,队列中所有节点都属于同一层,通过levelSize限定for循环的次数,就能确保每次for循环只处理当前层的节点,不会混入下一层的节点。假设我们有一棵简单的二叉树:
plaintext
3 / \ 9 20 / \ 15 7代码的执行流程如下:
while循环,levelSize=1,开启for循环(i=0):for循环结束,将 [3] 加入结果集,结果:[[3]];while循环,队列非空,levelSize=2,开启for循环:for循环结束,将 [9,20] 加入结果集,结果:[[3],[9,20]];while循环,队列非空,levelSize=2,开启for循环:for循环结束,将 [15,7] 加入结果集,结果:[[3],[9,20],[15,7]];while循环结束,返回最终结果。二叉树的层序遍历是广度优先搜索(BFS)在树形结构中的典型应用,其核心是借助队列的 “先进先出” 特性实现分层遍历。本文从核心思想出发,拆解了完整的代码实现,并通过示例分析了执行流程,最后梳理了复杂度。
掌握层序遍历不仅能解决二叉树的基础遍历问题,还能延伸到诸多变种问题(如 “按层打印二叉树并换行”“求二叉树的最大深度”“找二叉树某一层的最大值” 等)。理解队列在其中的作用,以及levelSize对分层的关键意义,是攻克这类问题的核心。
无论是面试中的算法题,还是实际开发中的树形数据处理,层序遍历都是必备的基础技能。希望本文能帮助你彻底理解并掌握这一经典算法。