LeetCode 437. 路径总和 III

437. 路径总和 III

Difficulty: 中等

给定一个二叉树,它的每个结点都存放着一个整数值。

找出路径和等于给定数值的路径总数。

路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。

示例:

root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8

      10
     /  \
    5   -3
   / \    \
  3   2   11
 / \   \
3  -2   1

返回 3。和等于 8 的路径有:

1\.  5 -> 3
2\.  5 -> 2 -> 1
3\.  -3 -> 11

Solution

Language: ****

解法一:暴力遍历。空间复杂度为O(1);层序遍历的时间复杂度为O(n),在求每个节点的路径和时候的时间复杂度为O(n) (single sided tree) to O(logn)(balanced tree),所以总的时间复杂度为O(nlogn) to O(n^2)。

解这道题的时候不能根据LeetCode 113. 路径总和 II - swordspoet - 博客园生搬硬套,113题的要求是从根节点到叶子节点的路径,而本题的要求是路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的。像下图的这种情形,sum为-1的时候路径有4条,而不是113题中获得的3条。

LeetCode 437. 路径总和 III

# 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: TreeNode, sum: int) -> int:
        if not root:
            return 0
        
        queue = [root]
        self.numOfPaths = 0
        while queue:
            size = len(queue)
            for i in range(size):
                node = queue.pop(0)
                self.pathSumHelper(node, sum)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
        return self.numOfPaths
        
    def pathSumHelper(self, root, sum):
        if not root:
            return 0
        if sum == root.val:
            self.numOfPaths += 1
        
        self.pathSumHelper(root.left, sum-root.val)
        self.pathSumHelper(root.right, sum-root.val)
上一篇:力扣437(前缀和解法)


下一篇:437.路径总和III