题目
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例: 给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
解题思路
和路径总和非常相似,不过这次是需要保存所有符合要求的路径。
依旧DFS,用0表示节点没有被访问过,用1表示节点被访问过。
若当前pop出的元素标记为0时,加到总和里,并且访问状态变成1。若当前的节点标记为1,并且是叶子节点,并且cur_sum == target_sum,把路径加到返回值中
时间复杂度
o
(
n
)
o(n)
o(n)
代码
class Solution:
def pathSum(self
, root
: TreeNode
, sum: int) -> List
[List
[int]]:
if not root
:
return []
target_paths
= []
stack
= [(root
, 0)]
cur_sum
= 0
visited_path
= []
while stack
:
p
, stat
= stack
.pop
()
if stat
== 0:
stack
.append
((p
, 1))
cur_sum
+= p
.val
visited_path
.append
(p
.val
)
if p
.left
:
stack
.append
((p
.left
, 0))
if p
.right
:
stack
.append
((p
.right
, 0))
else:
if (not p
.left
) and (not p
.right
) and cur_sum
== sum:
target_paths
.append
(visited_path
[::])
cur_sum
-= p
.val
visited_path
.pop
()
return target_paths