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
给定一个二叉树,求从某一节点开始的路径的和等于给定值,不必从根节点开始,可从二叉树的任意一个节点开始,节点值有正有负。
解法:递归。
Python:
class Solution(object): def pathSum(self, root, sum): """ :type root: TreeNode :type sum: int :rtype: int """ def pathSumHelper(root, curr, sum, lookup): if root is None: return 0 curr += root.val result = lookup[curr-sum] if curr-sum in lookup else 0 lookup[curr] += 1 result += pathSumHelper(root.left, curr, sum, lookup) + pathSumHelper(root.right, curr, sum, lookup) lookup[curr] -= 1 if lookup[curr] == 0: del lookup[curr] return result lookup = collections.defaultdict(int) lookup[0] = 1 return pathSumHelper(root, 0, sum, lookup)
Python:
class Solution2(object): def pathSum(self, root, sum): def pathSumHelper(root, prev, sum): if root is None: return 0 curr = prev + root.val; return int(curr == sum) + pathSumHelper(root.left, curr, sum) + pathSumHelper(root.right, curr, sum) if root is None: return 0 return pathSumHelper(root, 0, sum) + self.pathSum(root.left, sum) + self.pathSum(root.right, sum)
C++:
class Solution { public: int pathSum(TreeNode* root, int sum) { unordered_map<int, int> m; m[0] = 1; return helper(root, sum, 0, m); } int helper(TreeNode* node, int sum, int curSum, unordered_map<int, int>& m) { if (!node) return 0; curSum += node->val; int res = m[curSum - sum]; ++m[curSum]; res += helper(node->left, sum, curSum, m) + helper(node->right, sum, curSum, m); --m[curSum]; return res; } };
C++:
class Solution { public: int pathSum(TreeNode* root, int sum) { if (!root) return 0; return sumUp(root, 0, sum) + pathSum(root->left, sum) + pathSum(root->right, sum); } int sumUp(TreeNode* node, int pre, int& sum) { if (!node) return 0; int cur = pre + node->val; return (cur == sum) + sumUp(node->left, cur, sum) + sumUp(node->right, cur, sum); } };
类似题目:
[LeetCode] 113. Path Sum II 路径和 II