1. 问题背景与理解
今天遇到一道挺有意思的二叉树题目,LeetCode 437题"路径总和III"。这道题乍看简单,但实际写起来发现有不少细节需要注意。题目要求我们找出二叉树中路径和等于给定值的路径数量,这里的路径不需要从根节点开始,也不需要在叶子节点结束,但必须是从父节点到子节点的方向。
举个例子,给定二叉树:
code复制 10
/ \
5 -3
/ \ \
3 2 11
/ \ \
3 -2 1
当目标和为8时,我们需要返回3。因为存在以下三条路径:
- 5 → 3
- 5 → 2 → 1
- -3 → 11
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路分析
2.1 暴力解法:双重递归
最直观的想法是使用双重递归。外层递归遍历每个节点,内层递归计算以当前节点为起点的所有路径和。
javascript复制function pathSum(root, targetSum) {
if (!root) return 0;
// 计算以当前节点为起点的路径数
function countPaths(node, currentSum) {
if (!node) return 0;
currentSum += node.val;
return (currentSum === targetSum ? 1 : 0)
+ countPaths(node.left, currentSum)
+ countPaths(node.right, currentSum);
}
// 遍历每个节点作为起点
return countPaths(root, 0)
+ pathSum(root.left, targetSum)
+ pathSum(root.right, targetSum);
}
这个解法的时间复杂度是O(n²),因为对于每个节点,我们都可能遍历它的所有子节点。空间复杂度是O(n),由递归栈的深度决定。
2.2 优化思路:前缀和+哈希表
更高效的解法是使
