Leetcode 113.路径总和 II
1 题目描述(Leetcode题目链接)
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
2 题解
与112题路径总和相同的做法,深度优先搜索解决该问题
# 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]]:
if not root:
return []
retv = []
def DFS(stack, node, curr_sum):
if not node.left and not node.right and curr_sum == 0:
retv.append(stack)
return
if node.left:
DFS(stack + [node.left.val], node.left, curr_sum - node.left.val)
if node.right:
DFS(stack + [node.right.val], node.right, curr_sum - node.right.val)
DFS([root.val], root, sum - root.val)
return retv
但是效率好像不高,贴个靠前的解法,利用的是前序遍历:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def __init__(self):
self.stack = []
self.ans = []
def sums(self):#求和函数
res = 0
for i in self.stack:
res += i
return res
def qx(self,root,sum):#前序遍历
self.stack.append(root.val)
if root.left or root.right:
if root.left:#左节点
self.qx(root.left,sum)
self.stack.pop()
if root.right:#右节点
self.qx(root.right,sum)
self.stack.pop()
else:#叶子节点
if self.sums() == sum:
self.ans.append(self.stack.copy())
return
return
def pathSum(self, root: TreeNode, sum: int) -> bool:
if root:
self.qx(root,sum)
return self.ans
来源:CSDN
作者:就叫昵称吧
链接:https://blog.csdn.net/qq_39378221/article/details/104198726