題目分析:
給定一個二叉樹和一個目標和,找到所有從根節點到葉子節點路徑總和等於給定目標和的路徑。說明: 葉子節點是指沒有子節點的節點。
示例:給定如下二叉樹,以及目標和 sum = 22,
返回: [[5,4,11,2],[5,8,4,5]]
解題思路:
這一題是【LeetCode】112. Path Sum的進階版,比上一題要稍微難一些,但是用上一題的思路可以解決。
- 如果根節點爲空,直接返回[]
if not root: return []
- 如果當前節點有值,加入path
if root: path.append(root.val)
- 如果左右節點爲空,且當前節點值等於sum就將path加入res
if not root.left and not root.right and root.val == sum:
res.append(list(path))
- 如果左節點有值,遞歸左節點,遞歸返回時證明不滿足,要將path中最後一個節點pop
if root.left:
self.dfs(root.left, sum - root.val, path, res)
path.pop()
- 如果右節點有值,遞歸右節點,遞歸返回時證明不滿足,要將path中最後一個節點pop
if root.right:
self.dfs(root.right, sum - root.val, path, res)
path.pop()
提交代碼:(遞歸,Runtime: 40 ms, faster than 99.97% )
class Solution:
def pathSum(self, root: TreeNode, sum: int) -> 'List[List[int]]':
if not root: return []
res = []
self.dfs(root, sum, [], res)
return res
def dfs(self, root, sum, path, res):
if root: path.append(root.val)
if not root.left and not root.right and root.val == sum:
res.append(list(path))
if root.left:
self.dfs(root.left, sum - root.val, path, res)
path.pop()
if root.right:
self.dfs(root.right, sum - root.val, path, res)
path.pop()