一、题目来源:113. 路径总和 II
题目描述: 给你二叉树的根节点 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
输出:[]
解题思路
使用DFS算法,前序遍历,遍历根节点后遍历左右子树,递归遍历的时候把 目标数的差值作为参数传下去,并带入路径,递归退出去的临界值是:到达没有子树的结点时判定当前结点值和目标数差值是否相同。
有一个注意点:在递归调用时使用值传递的方式传递路径数组(而不是直接修改路径数组本身,因为这样涉及一个数据深拷贝的问题。)
具体的代码实现:
var pathSum = function(root, targetSum) {
let arr = []
const dfs = function(root, temp, sum) {
if(!root) return
if(!root.left && !root.right && sum == root.val) {
temp.push(root.val)
arr.push(JSON.parse(JSON.stringify(temp)) )
}
return dfs(root.left, [...temp, root.val], sum-root.val) || dfs(root.right, [...temp, root.val], sum-root.val)
}
dfs(root, [], targetSum);
return arr
};
错误的传递方式:
var pathSum = function(root, targetSum) {
let arr = []
const dfs = function(root, temp, sum) {
if(!root) return
if(!root.left && !root.right && sum == root.val) {
arr.push(JSON.parse(JSON.stringify(temp)) )
temp = []
}
temp.push(root.val)
return dfs(root.left, temp, sum-root.val) || dfs(root.right, temp, sum-root.val)
}
dfs(root, [], targetSum);
return arr
};
出现了数据累加,没有清空上一次满足条件的值。
运行结果:
|