一、题目描述
给你二叉树的根节点 root
和一个整数目标和 targetSum
,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
示例 1
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]
示例 2
输入:root = [1,2,3], targetSum = 5
输出:[]
示例 3
输入:root = [1,2], targetSum = 0
输出:[]
提示:
树中节点总数在范围 [0, 5000] 内
-1000 <= Node.val <= 1000
-1000 <= targetSum <= 1000
二、代码
代码如下:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]:
result = []
def Sum(root,path):
now_path = path.copy()
now_path.append(root.val)
if sum(now_path) == targetSum : #如果当前路径总和与目标相同,分2种情况
if root.left == None and root.right == None: # 当前节点是叶子结点
result.append(now_path)
print("result:",result)
return
else:# 不是叶子结点 ,继续遍历
if root.left:
Sum(root.left,now_path)
if root.right:
Sum(root.right,now_path)
if sum(now_path) != targetSum: #路径总和与目标不同,继续遍历
if root.left != None:
Sum(root.left,now_path)
if root.right != None:
Sum(root.right,now_path)
if root == None:
return result
Sum(root,[])
print(result)
return result
三、解题思路
本题基于对二叉树的遍历上进行判断,需要记录每一条从根节点到叶子结点路径的总和,本题解大致思路是遍历每一条到叶子结点的路径,用数组path记录当前路径。
需要注意的点有2个:
①该二叉树并不是一个搜索树,左右子树结点值完全随机,没有规律可言,所以必须从根节点到叶节点全部遍历;
②题目要求根节点到叶结点的路径和为目标值,在正常的遍历判断中,如果当前满足路径之和是目标值,还需要判断当前节点是不是叶节点。
最后将满足条件的当前路径path添加进入result中,返回result数组即可。