二叉树--层序遍历(迭代和递归)

迭代算法

使用队列,也是比较普遍的解法。

tips

通过记录队列的长度实现将每一层的节点分开。

代码

cpp 复制代码
// ==========================================
	// 方法一:迭代法 (BFS - 广度优先搜索)
	// 核心思想:利用队列 (Queue) 先进先出的特性,一层一层地遍历
	// ==========================================
	vector<vector<int>> levelOrder(TreeNode* root) {
		vector<vector<int>> result;
		queue<TreeNode*> q; // 定义队列
		
		if (root != NULL) q.push(root); // 初始化:将根节点入队
		
		while (!q.empty()) {
			int size = q.size(); // 【关键】记录当前层级的节点数量
			vector<int> vec;     // 存储当前这一层的所有节点值
			
			// 遍历当前层的每一个节点
			for (int i = 0; i < size; i++) {
				TreeNode* node = q.front(); // 取出队首节点
				q.pop();
				
				vec.push_back(node->val);   // 记录值
				
				// 将左右子节点加入队列,作为下一层的数据等待处理
				if (node->left) q.push(node->left);
				if (node->right) q.push(node->right);
			}
			// 当前层处理完毕,将这一层的数组放入结果集中
			result.push_back(vec);
		}
		return result;
	}
	

递归算法

递归算法需要解决怎么知道遍历的节点是否在同一层,引入一个变量depth记录深度即可,将节点值直接压入result二维数组即可。

tips

将节点值压入result时一定防止访问越界,要提前创建好,即if(result.size == depth) result.push_back(vector<int>())

代码

cpp 复制代码
// ==========================================
	// 方法二:递归法 (DFS - 深度优先搜索)
	// 核心思想:增加一个参数记录层数,可以识别是否在同一层
	// ==========================================
	void order(TreeNode* node, vector<vector<int>>& result, int depth) {
		if (node == NULL) return; // 递归终止条件
		
		// 【关键】如果 result 的大小等于当前深度,说明 result 还没创建这一层
		// 需要新压入一个空的 vector 来存放这一层的数据
		if (result.size() == depth) {
			result.push_back(vector<int>());
		}
		
		// 根据 depth,将当前节点值放入对应的层级数组中
		result[depth].push_back(node->val);
		
		// 递归处理左子树和右子树,深度 +1
		if (node->left) order(node->left, result, depth + 1);
		if (node->right) order(node->right, result, depth + 1);
	}
	
	vector<vector<int>> levelOrder_(TreeNode* root) {
		vector<vector<int>> result;
		int depth = 0;
		order(root, result, depth); // 启动递归
		return result;
	}
相关推荐
qizayaoshuap几秒前
# [特殊字符] 密码生成器 — 鸿蒙ArkTS安全算法与密码强度评估系统
java·算法·安全·华为·harmonyos
在水一缸2 分钟前
深入浅出 Catch2:现代 C++ 测试框架的优雅实践
开发语言·c++·单元测试·log4j·测试框架·catch2
良木林10 分钟前
滑动窗口 - LeetCode hot 100
javascript·算法·leetcode·双指针·滑动窗口
华玥作者13 分钟前
uniapp 万条数据不卡顿:我写了个虚拟列表组件 hy-list,原生支持瀑布流
数据结构·uni-app·list·vue3
2401_8414956414 分钟前
【数据结构】B*树
数据结构·c++·b树·算法·删除·插入·三分分裂
不如语冰1 小时前
AI大模型入门-模块导入import
数据结构·人工智能·pytorch·python
斐夷所非1 小时前
在纷繁竞逐中稳步前行:C++ 2006–2020
c++
岑梓铭1 小时前
《考研408数据结构》第七章(7.1 查找:顺序查找、折半查找、分块查找)复习笔记
数据结构·笔记·考研·408·ds·查找
壹号用户1 小时前
c++入门之list了解及使用
数据结构·list
QXWZ_IA2 小时前
**电力登高作业高空失保实时监管:千寻智能安全带高挂低用监测方案**
人工智能·科技·算法·能源·智能硬件