112. 路径总和

1. 题目

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false

叶子节点 是指没有子节点的节点。

示例 1:

img

1
2
3
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。

示例 2:

img

1
2
3
4
5
6
输入:root = [1,2,3], targetSum = 5
输出:false
解释:树中存在两条根节点到叶子节点的路径:
(1 --> 2): 和为 3
(1 --> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。

示例 3:

1
2
3
输入:root = [], targetSum = 0
输出:false
解释:由于树是空的,所以不存在根节点到叶子节点的路径。

提示:

  • 树中节点的数目在范围 [0, 5000]
  • -1000 <= Node.val <= 1000
  • -1000 <= targetSum <= 1000

2. 思路

  • 已知题目要求判断二叉树根节点 - 叶子节点的所有路径中,是否存在和相加能够达到targetSum值的路径
  • 从提示可得知,二叉树的节点数量范围为0-5000
  • 根据以上,可以尝试采取递归的做法
    • root为空时,返回false
    • root为叶子节点时,直接判断并返回root.val == targetSum
    • 如果root节点并不是叶子节点,则递归传入并root.leftroot.right进行判断,而对应的targetSum值,则对应的减去root.val
    • 将上述左右节点的判断结果直接进行返回,如果左右节点中任意一个节点返回true,则表示存在某一条路径和相加能够达到targetSum

3. 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean hasPathSum(TreeNode root, int targetSum) {
if (root == null) {
return false;
}

if (root.left == null && root.right == null) {
return root.val == targetSum;
}

return hasPathSum(root.left, targetSum - root.val) || hasPathSum(root.right, targetSum - root.val);
}
}

4. 复杂度

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

image-20231018115328066