题目:输入一个二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
示例:
思路:首先要理解题意,是从根节点往子节点连。
1、如果只有根节点或者找到叶子节点,我们就把其对应的val值返回
2、如果不是叶子节点,我们分别对根节点的左子树、右子树进行递归,直到找到叶子结点。然后遍历把叶子结点和父节点对应的val组成的序列返回上一层;如果没找到路径,其实也返回了序列,只不过是[]
利用减法+递归。
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def pathSum(self, root, targetSum):
"""
:type root: TreeNode
:type targetSum: int
:rtype: List[List[int]]
"""
res = []
if not root.left and not root.right and root.val == target:
return [[root.val]]
else:
left = self.pathSum(root.left , target - root.val)
right = self.pathSum(root.right , target - root.val)
for item in left+right:
res.append([root.val] + item)
return res
利用DFS:
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def func(self , root , target):
res = []
def dfs(node , get_sum , p):
if node:
p.append(node.val)
get_sum -= node.val # 通过减法实现
if not node.left and not node.right and get_sum == 0:
res.append(p[:])
dfs(node.left , get_sum , p)
dfs(node.right , get_sum , p)
p.pop() # dfs通过栈实现,直到找到最后一个节点后,弹出
dfs(root , target , [])
return res