1. 程式人生 > 實用技巧 >LeetCode 437. 路徑總和 III

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條。

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