Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.
Note: A leaf is a node with no children.
Example:
Given the below binary tree and sum = 22
,
5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1
Return:
[ [5,4,11,2], [5,8,4,5] ]
递归写法(dfs):
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def pathSum(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: List[List[int]]
"""
if not root:
return []
res = []
self.dfs(root, sum, [], res)
return res
def dfs(self, root, sum, ls, res):
if not root.left and not root.right and sum == root.val:
ls.append(root.val)
res.append(ls)
if root.left:
self.dfs(root.left, sum-root.val, ls+[root.val], res)
if root.right:
self.dfs(root.right, sum-root.val, ls+[root.val], res)
非递归写法一:队列
def pathSum3(self, root, sum):
if not root:
return []
res = []
queue = [(root, root.val, [root.val])]
while queue:
curr, val, ls = queue.pop(0)
if not curr.left and not curr.right and val == sum:
res.append(ls)
if curr.left:
queue.append((curr.left, val+curr.left.val, ls+[curr.left.val]))
if curr.right:
queue.append((curr.right, val+curr.right.val, ls+[curr.right.val]))
return res
非递归写法二:栈
def pathSum4(self, root, sum):
if not root:
return []
res = []
stack = [(root, sum-root.val, [root.val])]
while stack:
curr, val, ls = stack.pop()
if not curr.left and not curr.right and val == 0:
res.append(ls)
if curr.right:
stack.append((curr.right, val-curr.right.val, ls+[curr.right.val]))
if curr.left:
stack.append((curr.left, val-curr.left.val, ls+[curr.left.val]))
return res