题解 | #牛的奶量统计II#
牛的奶量统计II
https://www.nowcoder.com/practice/9c56daaded6b4ba3a9f93ce885dab764
知识点:二叉树,深度优先搜索,前缀和
要在树中找到一个路径和为targetSum的路径,一个可行的方法是对于每个节点都去计算以该节点为起点的路径和,去比较所有的路径是否为目标和。
不难发现,这样做多了很多重复的计算,我们可以使用Set集合存储我们从根节点开始到每一个节点走过的路径和,举个例子来说,如果根节点到A节点的路径和为sumA,还有一个节点B是A的子树下面的节点,根节点到B节点的路径和为sumB,如果sumB-sumA==targetSum,则说明,A节点到B节点的路径和为targetSum,我们也就找到了目标路径。
Java题解如下
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @param targetSum int整型
* @return bool布尔型
*/
private boolean res = false;
private int targetSum;
public boolean hasPathSumII (TreeNode root, int targetSum) {
// write code here
this.targetSum = targetSum;
Set<Integer> set = new HashSet<>();
set.add(0);
dfs(root, set, 0);
return res;
}
private void dfs(TreeNode root, Set<Integer> set, int sum) {
if(root == null || res) {
return;
}
sum += root.val;
if(set.contains(sum - targetSum)) {
res = true;
return;
}
set.add(sum);
dfs(root.left, set, sum);
dfs(root.right, set, sum);
set.remove(sum);
sum -= root.val;
}
}

