题目描述
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
示例
示例 1:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
提示:
节点总数 <= 10000
解答方法
方法一:回溯法(先序遍历+路径记录)
思路
先序遍历: 按照“根、左、右”的顺序,遍历树的所有节点。
路径记录: 在先序遍历中,当 ① 根节点到叶节点形成的路径 且 ② 路径各节点值的和等于目标值 sum 时,记录此路径。
参考:https://leetcode-cn.com/problems/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-jing-lcof/solution/mian-shi-ti-34-er-cha-shu-zhong-he-wei-mou-yi-zh-5/
代码
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def pathSum(self, root: TreeNode, sum: int) -> List[List[int]]:
path = []
res = []
def dfs(root, sum):
if not root:
return
path.append(root.val)
sum -= root.val
if sum == 0 and not root.left and not root.right:
res.append(path[:])
dfs(root.left, sum)
dfs(root.right, sum)
path.pop()
dfs(root,sum)
return res
时间复杂度
O(N) : N 为二叉树的节点数,先序遍历需要遍历所有节点。
空间复杂度
O(N) : 最差情况下,即树退化为链表时,path 存储所有树节点,使用O(N) 额外空间。