Welcome to Subscribe On Youtube
-
import java.util.HashMap; /** 437 Path Sum III You are given a binary tree in which each node contains an integer value. Find the number of paths that sum to a given value. The path does not need to start or end at the root or a leaf, but it must go downwards (traveling only from parent nodes to child nodes). The tree has no more than 1,000 nodes and the values are in the range -1,000,000 to 1,000,000. Example: root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8 10 / \ 5 -3 / \ \ 3 2 11 / \ \ 3 -2 1 Return 3. The paths that sum to 8 are: 1. 5 -> 3 2. 5 -> 2 -> 1 3. -3 -> 11 @tag-tree */ public class Path_Sum_III { /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public int pathSum(TreeNode root, int sum) { // 路径之和 => 其个数 HashMap<Integer, Integer> preSum = new HashMap<>(); // @note: initialiated to be 1, 当 curSum 等于 sum 的时候,表明从根结点到当前结点正好是一条符合要求的路径 preSum.put(0,1); return helper(root, 0, sum, preSum); } public int helper(TreeNode root, int currSum, int target, HashMap<Integer, Integer> preSum) { if (root == null) { return 0; } currSum += root.val; int res = preSum.getOrDefault(currSum - target, 0); // add before pass down as prevSum preSum.put(currSum, preSum.getOrDefault(currSum, 0) + 1); res += helper(root.left, currSum, target, preSum) + helper(root.right, currSum, target, preSum); // restore, since it's not prevSum when returning to upper recursion preSum.put(currSum, preSum.get(currSum) - 1); return res; } } } ############ /** * 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 { private Map<Long, Integer> cnt = new HashMap<>(); private int targetSum; public int pathSum(TreeNode root, int targetSum) { cnt.put(0L, 1); this.targetSum = targetSum; return dfs(root, 0); } private int dfs(TreeNode node, long s) { if (node == null) { return 0; } s += node.val; int ans = cnt.getOrDefault(s - targetSum, 0); cnt.merge(s, 1, Integer::sum); ans += dfs(node.left, s); ans += dfs(node.right, s); cnt.merge(s, -1, Integer::sum); return ans; } }
-
// OJ: https://leetcode.com/problems/path-sum-iii/ // Time: O(N^2) // Space: O(N^2) class Solution { int ans = 0; unordered_map<int, int> dfs(TreeNode *root, int sum) { // map of sums from the current node to a child node if (!root) return {}; unordered_map<int, int> m{ {root->val, 1} }; auto left = dfs(root->left, sum), right = dfs(root->right, sum); for (auto &[val, cnt] : left) m[val + root->val] += cnt; for (auto &[val, cnt] : right) m[val + root->val] += cnt; if (m.count(sum)) ans += m[sum]; return m; } public: int pathSum(TreeNode* root, int sum) { dfs(root, sum); return ans; } };
-
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def pathSum(self, root: Optional[TreeNode], targetSum: int) -> int: def dfs(node, s): if node is None: return 0 s += node.val ans = cnt[s - targetSum] cnt[s] += 1 ans += dfs(node.left, s) ans += dfs(node.right, s) cnt[s] -= 1 return ans cnt = Counter({0: 1}) return dfs(root, 0) ############ class Solution(object): def pathSum(self, root, target): """ :type root: TreeNode :type target: int :rtype: int """ self.count = 0 preDict = {0: 1} def dfs(p, target, pathSum, preDict): if p: pathSum += p.val self.count += preDict.get(pathSum - target, 0) preDict[pathSum] = preDict.get(pathSum, 0) + 1 dfs(p.left, target, pathSum, preDict) dfs(p.right, target, pathSum, preDict) preDict[pathSum] -= 1 dfs(root, target, 0, preDict) return self.count
-
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ func pathSum(root *TreeNode, targetSum int) int { cnt := map[int]int{0: 1} var dfs func(*TreeNode, int) int dfs = func(node *TreeNode, s int) int { if node == nil { return 0 } s += node.Val ans := cnt[s-targetSum] cnt[s]++ ans += dfs(node.Left, s) + dfs(node.Right, s) cnt[s]-- return ans } return dfs(root, 0) }
-
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public int pathSum(TreeNode root, int sum) { if (root == null) return 0; return paths(root, sum) + pathSum(root.left, sum) + pathSum(root.right, sum); } private int paths(TreeNode root, int sum) { if (root == null) return 0; int paths = 0; if (root.val == sum) paths++; paths += paths(root.left, sum - root.val); paths += paths(root.right, sum - root.val); return paths; } } ############ /** * 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 { private Map<Long, Integer> cnt = new HashMap<>(); private int targetSum; public int pathSum(TreeNode root, int targetSum) { cnt.put(0L, 1); this.targetSum = targetSum; return dfs(root, 0); } private int dfs(TreeNode node, long s) { if (node == null) { return 0; } s += node.val; int ans = cnt.getOrDefault(s - targetSum, 0); cnt.merge(s, 1, Integer::sum); ans += dfs(node.left, s); ans += dfs(node.right, s); cnt.merge(s, -1, Integer::sum); return ans; } }
-
// OJ: https://leetcode.com/problems/path-sum-iii/ // Time: O(N^2) // Space: O(N^2) class Solution { int ans = 0; unordered_map<int, int> dfs(TreeNode *root, int sum) { // map of sums from the current node to a child node if (!root) return {}; unordered_map<int, int> m{ {root->val, 1} }; auto left = dfs(root->left, sum), right = dfs(root->right, sum); for (auto &[val, cnt] : left) m[val + root->val] += cnt; for (auto &[val, cnt] : right) m[val + root->val] += cnt; if (m.count(sum)) ans += m[sum]; return m; } public: int pathSum(TreeNode* root, int sum) { dfs(root, sum); return ans; } };
-
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def pathSum(self, root: Optional[TreeNode], targetSum: int) -> int: def dfs(node, s): if node is None: return 0 s += node.val ans = cnt[s - targetSum] cnt[s] += 1 ans += dfs(node.left, s) ans += dfs(node.right, s) cnt[s] -= 1 return ans cnt = Counter({0: 1}) return dfs(root, 0) ############ class Solution(object): def pathSum(self, root, target): """ :type root: TreeNode :type target: int :rtype: int """ self.count = 0 preDict = {0: 1} def dfs(p, target, pathSum, preDict): if p: pathSum += p.val self.count += preDict.get(pathSum - target, 0) preDict[pathSum] = preDict.get(pathSum, 0) + 1 dfs(p.left, target, pathSum, preDict) dfs(p.right, target, pathSum, preDict) preDict[pathSum] -= 1 dfs(root, target, 0, preDict) return self.count
-
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ func pathSum(root *TreeNode, targetSum int) int { cnt := map[int]int{0: 1} var dfs func(*TreeNode, int) int dfs = func(node *TreeNode, s int) int { if node == nil { return 0 } s += node.Val ans := cnt[s-targetSum] cnt[s]++ ans += dfs(node.Left, s) + dfs(node.Right, s) cnt[s]-- return ans } return dfs(root, 0) }