二叉树--求最小深度(迭代和递归)

使用了两种解法,递归法和迭代法。

两种方法的对比总结

  1. DFS (方法一 minDepth):

    • 特点 : 代码简洁,逻辑通过 max 巧妙处理了单链树的情况。

    • 缺点: 必须遍历完所有的分支才能确定谁最小。如果树严重左偏或右偏,栈深度较大。

  2. BFS (方法二 levelOrder):

    • 特点: 利用队列层序遍历。

    • 优点 : 效率更高 。因为它只要找到第一个 叶子节点就直接 return depth 了,不需要像 DFS 那样把深处的节点也遍历一遍。在求"最短路径"或"最小深度"类问题时,BFS 通常是首选。

递归法

注意:如果左子树为空(left=0)或右子树为空(right=0),说明这不是叶子节点(最小深度要找到叶子节点),我们不能取 min(因为 min 会取到 0),必须取非空的那一侧(即 max)。

代码

cpp 复制代码
// ==========================================
	// 方法一:递归法 (DFS - 后序遍历)
	// 核心思想:分别求左右子树深度,处理单支情况,最后取最小值
	// ==========================================
	int minDepth(TreeNode* root) {
		if (root == NULL) return 0; // 终止条件
		
		// 递归计算左右子树的深度
		int left = minDepth(root->left);
		int right = minDepth(root->right);
		
		// 【关键逻辑】
		// 如果左子树为空(left=0)或右子树为空(right=0),说明这不是叶子节点,
		// 我们不能取 min(因为 min 会取到 0),必须取非空的那一侧(即 max)。
		// 例如:树 1->2,根节点 1 不是叶子,必须走 2 那边。
		if (left == 0 || right == 0) {
			return max(left, right) + 1;
		}
		
		// 左右都不为空,说明是正常的左右分支,取最小的一边 + 根节点 1
		return min(left, right) + 1;
	}

迭代法

使用层序遍历,一层一层往下找,一旦遇到第一个"叶子节点",马上返回深度。

代码

cpp 复制代码
// ==========================================
	// 方法二:迭代法 (BFS - 广度优先搜索)
	// 核心思想:一层一层往下找,一旦遇到第一个"叶子节点",马上返回深度。
	// 优点:对于求最小深度,这通常比 DFS 更快,因为它不需要遍历整棵树。
	// ==========================================
	int minDepthBFS(TreeNode* root) {
		int depth = 0;
		queue<TreeNode*> q;
		if (root) q.push(root);
		
		while (!q.empty()) {
			int size = q.size(); // 记录当前层有多少个节点
			depth++;             // 开始处理新的一层,深度 +1
			
			for (int i = 0; i < size; i++) {
				TreeNode* node = q.front();
				q.pop();
				
				// 【核心优化】
				// 如果当前节点没有左孩子且没有右孩子,说明它是我们遇到的
				// "层级最浅"的叶子节点。直接返回当前深度,无需继续遍历!
				if (node->left) q.push(node->left);
				if (node->right) q.push(node->right);
				
				if (!node->left && !node->right) 
					return depth; // 找到最近的叶子,直接返回结果
			}
		}
		return depth;
	}
相关推荐
2401_892070981 天前
【Linux C++ 日志系统实战】LogFile 日志文件管理核心:滚动策略、线程安全与方法全解析
linux·c++·日志系统·日志滚动
yuzhuanhei1 天前
Visual Studio 配置C++opencv
c++·学习·visual studio
小O的算法实验室1 天前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
‎ദ്ദിᵔ.˛.ᵔ₎1 天前
LIST 的相关知识
数据结构·list
不爱吃炸鸡柳1 天前
C++ STL list 超详细解析:从接口使用到模拟实现
开发语言·c++·list
M--Y1 天前
Redis常用数据类型
数据结构·数据库·redis
十五年专注C++开发1 天前
RTTR: 一款MIT 协议开源的 C++ 运行时反射库
开发语言·c++·反射
‎ദ്ദിᵔ.˛.ᵔ₎1 天前
STL 栈 队列
开发语言·c++
2401_892070981 天前
【Linux C++ 日志系统实战】高性能文件写入 AppendFile 核心方法解析
linux·c++·日志系统·文件写对象
郭涤生1 天前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法