zoukankan      html  css  js  c++  java
  • [LeetCode] 437. Path Sum III 路径和 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

    给定一个二叉树,求从某一节点开始的路径的和等于给定值,不必从根节点开始,可从二叉树的任意一个节点开始,节点值有正有负。

    解法:递归。

    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] 112. Path Sum 路径和

    [LeetCode] 113. Path Sum II 路径和 II

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    架构之道(5)
    项目的命名规范
    semantic框架
    jquery.timepicker.js
    jquery.marquee.js
    CkEditor
    快速测试,其实没什麽大不了
    架构之道(4)
    架构之道(3)
    子网划分与子网掩码
  • 原文地址:https://www.cnblogs.com/lightwindy/p/8598781.html
Copyright © 2011-2022 走看看