【算法18天:Day18】第六章二叉树 LeetCode 路径总和ii(113)

34 阅读1分钟

题目三:

image.png

解法一:

解题思路:这个题跟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;
};