题目描述:给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和sum = 22
,5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1
返回:
[ [5,4,11,2], [5,8,4,5] ]
解法1。 回溯,返回到上一层时,记得pop,就是把刚刚那一层append的元素去掉,类似于复原自顶向下递归时这一层的样子,而非递归到底开始回溯的时候的样子。
class Solution(object):
def pathSum(self, root, expectNumber):
# write code here
if not root:
return []
res = []
path = []
self.FindPathHelper(root, expectNumber, path, res)
return res
def FindPathHelper(self, root, target, path, res):
if not root:
return
path.append(root.val)
if root.val == target and not root.left and not root.right:
res.append(path[:])
self.FindPathHelper(root.left, target-root.val, path, res)
self.FindPathHelper(root.right, target-root.val, path, res)
path.pop() # 这个地方一定要加,不然输出的path会多出很多元素,也是回溯的必备
解法2。迭代的方式,用queue这个队列维护还未遍历过的节点,一开始只有root和截至root之前遍历的节点val这两者构成的元组,后来先左后右添加节点信息,先入先出,遇到叶子节点判断和是否等于target,是则将path放到res中。
class Solution(object):
def pathSum(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: List[List[int]]
"""
if not root: return []
paths = []
queue = []
queue.append((root, []))
while queue:
tree, path = queue.pop()
if not tree.left and not tree.right:
if self.get_sum(path) + tree.val == sum:
path.append(tree.val)
paths.append(path)
else:
if tree.left:
p = path[:]
p.append(tree.val)
queue.insert(0, (tree.left, p))
if tree.right:
p = path[:]
p.append(tree.val)
queue.insert(0, (tree.right, p))
return paths
def get_sum(self, nums):
return sum(nums)