LeetCode-112-路径总和

题目

给你二叉树的根节点 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

题解

这一题我的思路很简单,用dfs找到叶子结点的路径,用一个哈希表保存根节点到各个叶子节点的值,dfs里遇到叶子节点了,就把值保存到哈希表中去。如果哈希表里存在targetSum就退出不再找了。

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
29
30
31
32
class Solution {
public boolean hasPathSum(TreeNode root, int targetSum) {
if (root == null) {
return false;
}
int res = 0;
HashMap<Integer, Integer> sumMap = new HashMap<>();
dfs(root, sumMap, res, targetSum);
if (sumMap.containsKey(targetSum)) {
return true;
} else {
return false;
}
}

// dfs找一下叶子节点,找到了就计算路径的值
public void dfs(TreeNode root, HashMap<Integer, Integer> sumMap, int sum, int targetSum) {
if (sumMap.containsKey(targetSum)) {
return;
}
if (root != null) {
if (root.right != null || root.left != null) {
sum += root.val;
dfs(root.left, sumMap, sum, targetSum);
dfs(root.right, sumMap, sum, targetSum);
} else {
sum += root.val;
sumMap.put(sum, sum);
}
}
}
}

LeetCode-112-路径总和
https://excelius.xyz/leetcode-112-路径总和/
作者
Ther
发布于
2024年7月28日
许可协议