题解 | #牛的奶量统计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; } }