LeetCode 437. 路徑總和 III
阿新 • • 發佈:2020-12-06
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)