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条。
# 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)