这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战
题目描述
给你二叉树的根节点 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`
实现思路
我们用回调对二叉树深度遍历进行探底,因为是个二叉树,for循环不用写了,直接按顺序对节点的左右子树进行dfs回调遍历直到当前节点没有左右子树,再将途经的val进行相加如果等于目标数则将其存入结果数组中。
整体流程:
- 创建结果集合res
- 定义回调函数dfs
- 定义节点集合arr用来存储途经节点的val
- 遍历节点的左右子树
- 到达终结回调条件(节点没有左右子树)然后再判断节点和是否符合目标值,符合则添加结果集合。
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @param {number} target
* @return {number[][]}
*/
var pathSum = function(root, target) {
let res = []
let dfs = function (item, arr1) {
let arr = Array.from(arr1) //存储途经节点的val
arr.push(item.val)
item.left && dfs(item.left, arr) //遍历左节点
item.right && dfs(item.right, arr) //遍历右节点节点
if (!item.left && !item.right) {
let sum = arr.reduce(function(prev, curr, idx, arr){ //节点集合求和
return prev + curr;
})
if(sum == target) { //符合目标值
res.push(arr)
}
}
}
if(!root) return []
dfs(root, [])
return res
};