题目三:
解法一:
解题思路:这个题跟112的路径总数很类似,需要注意的是,如果走到空结点,表明当前路径是不符合的,因此需要pop出最后push进去的叶子结点。
var pathSum = function(root, targetSum) {
const res = []
var traversal = function(cur, curPath, sum) {
if (cur === null) return
curPath.push(cur.val)
sum += cur.val
if (cur.left === null && cur.right === null && sum == targetSum) {
// res.push(Array.from(curPath))
res.push([...curPath]) // 不能写res.push(path), 要深拷贝
}
cur.left && traversal(cur.left, curPath, sum)
cur.right && traversal(cur.right, curPath, sum)
curPath.pop()
}
traversal(root,[], 0)
return res
};
解法二:(迭代)
参考代码随想录~
let pathSum = function(root, targetSum) {
if(root === null) return [];
let nodeArr = [root];
let resArr = []; // 记录符合目标和的返回路径
let tempArr = [[]]; // 对应路径
let countArr = [0]; //对应和
while(nodeArr.length) {
let curNode = nodeArr.shift();
let curVal = countArr.shift();
let curNodeArr = tempArr.shift();
curVal += curNode.val;
curNodeArr.push(curNode.val);
// 为叶子结点,且和等于目标数,将此次结果数组push进返回数组中
if (curNode.left === null && curNode.right === null && curVal === targetSum) {
resArr.push(curNodeArr);
}
// 左节点,将当前的和及对应路径也对应记录下来
if (curNode.left) {
nodeArr.push(curNode.left);
countArr.push(curVal);
tempArr.push([...curNodeArr]);
}
// 右节点,将当前的和及对应路径也对应记录下来
if (curNode.right) {
nodeArr.push(curNode.right);
countArr.push(curVal);
tempArr.push([...curNodeArr]);
}
}
return resArr;
};