![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4ecd32dbac1db4020e962d59c6f17bc7.jpeg)
题目
给你二叉树的根节点 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
思路
- 首先我们需要一个result数组来存放所有路径数组,一个path数组来存放每条路径。仍然使用强大的递归来做。
- 递归函数的参数是当前节点和当前的路径和,没有返回值,只是在返回前判断一下是否要记录结果
- 递归返回条件是当遇到叶子节点时就直接返回,在返回前判断路径和是否满足要求,满足的话就把叶子节点的值加入path数组,然后把path数组拷贝一份后加入叶子节点的值,然后放到结果数组result中,
- 单层递归的逻辑:将当前节点的值加入path数组,左节点存在就递归左子树,右节点存在就递归右子树,回到当前这层时把当前节点的值从path中移出。
代码
var pathSum = function(root, targetSum) {
function traversal(node , sum){
if(!node.left && !node.right && sum === targetSum) {
let _path = path.slice(0) //拷贝path
_path.push(node.val) //加入当前节点
return result.push(_path)
}
if(!node.left && !node.right) return
path.push(node.val)
if(node.left) traversal(node.left , sum + node.left.val)
if(node.right) traversal(node.right , sum + node.right.val)
path.pop()
}
if(!root) return []
let result = []
let path = []
traversal(root , root.val)
return result
};
关注我的专栏,每天更新三道leetcode题解,一起变强!