https://leetcode.com/problems/path-sum-iii/submissions/
题目:
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { int count = 0; public int pathSum(TreeNode root, int sum) {
//第2个integer是该值的频次 Map<Integer,Integer> map = new HashMap<>(); //如果从root加到leaf正好= sum 就会命中 map.put(0,1); findAllNodeSum(root,0,sum,map); return count; } void findAllNodeSum(TreeNode root,int cursum,int target,Map<Integer,Integer> map){ if(root==null){ return ; } cursum = cursum +root.val; if(map.containsKey(cursum-target)){ count += map.get(cursum-target); } //判断是否以前节点的加现在的节点是否有符合要求的 if(!map.containsKey(cursum)){ map.put(cursum,1); }else{ map.put(cursum,map.get(cursum)+1); } //dfs findAllNodeSum(root.left,cursum,target,map); findAllNodeSum(root.right,cursum,target,map); //把当前叶子节点的和清掉 map.put(cursum,map.get(cursum)-1); } }
如下图涉及自身为target和从root-leaf等于target2种情况
从root到leaf相加等于target被统计到count中是因为0,1在map中
这种情况是当前节点与上面的局部节点相加等于target,这种情况被统计到count,是因为5当时在map中