二叉树的路径问题算是高频考点之一,今天拆解 LeetCode 简单难度的 112. 路径总和,不仅搞懂题目核心,还会对比两种常用解法(迭代 DFS + 递归 DFS),帮助理清思路、避坑易错点,适合刚接触二叉树路径题的小伙伴入门。
一、题目解读
题目很直白,给定二叉树的根节点 root 和目标和 targetSum,判断是否存在一条从 根节点到叶子节点 的路径,这条路径上所有节点的值相加等于 targetSum。
这里有两个关键细节,一定要注意(否则容易踩坑):
- 路径必须是「根节点 → 叶子节点」,中间不能中断,也不能是叶子节点到其他节点、非根节点到叶子节点;
- 叶子节点的定义:没有左、右子节点的节点(即 left === null 且 right === null),这是判断路径终点的核心条件。
举个简单例子:如果二叉树只有根节点,值为 5,targetSum 为 5 → 根节点就是叶子节点,返回 true;如果根节点值为 5,有一个左子节点值为 3,targetSum 为 5 → 没有到叶子节点的路径(根节点不是叶子,左子节点未判断总和),返回 false。
二、核心思路
这道题的核心是「遍历二叉树」,并记录从根节点到当前节点的路径和,当遍历到叶子节点时,判断路径和是否等于目标和。
二叉树的遍历有递归和迭代两种常用方式,对应到这道题,我们可以实现两种解法,本质都是深度优先搜索(DFS)—— 优先走一条路径到叶子,再回溯走其他路径,效率一致,但编码风格不同。
三、完整解法
先给出 TreeNode 的定义(题目已提供,此处复用,保证代码可直接运行):
class TreeNode {
val: number;
left: TreeNode | null;
right: TreeNode | null;
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
this.val = (val === undefined ? 0 : val);
this.left = (left === undefined ? null : left);
this.right = (right === undefined ? null : right);
}
}
解法一:迭代 DFS
迭代方式用「栈」存储遍历的节点,同时记录「从根节点到当前节点的路径和」,每弹出一个节点,就判断是否为叶子节点、路径和是否匹配,不匹配则继续压入其左右子节点(带更新后的路径和)。


