[leetcode: Python]437.Path Sum 3

来源:互联网 发布:godaddy免费域名 编辑:程序博客网 时间:2024/05/18 20:05

Title:
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   1Return 3. The paths that sum to 8 are:1.  5 -> 32.  5 -> 2 -> 13. -3 -> 11

寻找路径和等于给定值的路径数量

方法一:1355ms(OMG……)
遍历+递归

# Definition for a binary tree node.# class TreeNode(object):#     def __init__(self, x):#         self.val = x#         self.left = None#         self.right = Noneclass Solution(object):    def pathSum(self, root, sum):        """        :type root: TreeNode        :type sum: int        :rtype: int        """        def traverse(root, val):            if not root:                return 0            res = (val == root.val)            res += traverse(root.left, val - root.val)            res += traverse(root.right, val - root.val)            return res        if not root:            return 0        ans = traverse(root, sum)        ans += self.pathSum(root.left, sum)        ans += self.pathSum(root.right, sum)        return ans

方法二:122ms

class Solution(object):    def pathSum(self, root, sum):        """        :type root: TreeNode        :type sum: int        :rtype: int        """        self.count=0        self.helper(root,sum,0,{0:1})        return self.count    def helper(self,root,sum,currSum,cache):        if root:            if ((currSum+root.val-sum) in cache):                self.count+=cache.get(currSum+root.val-sum)            cache[currSum+root.val] = cache.get(currSum+root.val,0)+1            self.helper(root.left,sum,currSum+root.val,cache)            self.helper(root.right,sum,currSum+root.val,cache)            cache[currSum+root.val]=cache.get(currSum+root.val)-1        return

方法三:76ms(to be understood)

# Definition for a binary tree node.# class TreeNode(object):#     def __init__(self, x):#         self.val = x#         self.left = None#         self.right = Nonefrom collections import defaultdictclass Solution(object):    def inorder(self, root, target, summ, di):        if not root:            return 0        summ += root.val        numWays = di[summ-target]        di[summ] += 1        numWays += self.inorder(root.left, target, summ, di) + self.inorder(root.right, target, summ, di)        di[summ] -= 1        return numWays    def pathSum(self, root, target):        di = defaultdict(int)        di[0] = 1        return self.inorder(root, target, 0, di)        """        :type root: TreeNode        :type sum: int        :rtype: int        """

方法四:79ms(+1)

# Definition for a binary tree node.# class TreeNode(object):#     def __init__(self, x):#         self.val = x#         self.left = None#         self.right = Noneimport collectionsclass Solution(object):    def pathSum(self, root, sum):        """        :type root: TreeNode        :type sum: int        :rtype: int        """        d = collections.defaultdict(int)        d[0] = 1        def pSum(root, cur, sum):            if not root: return 0            res = 0            cur += root.val            if cur - sum in d:                res += d[cur - sum]            d[cur] += 1            res += pSum(root.left, cur, sum) + pSum(root.right, cur, sum)            d[cur] -= 1            return res        return pSum(root, 0, sum)
原创粉丝点击