【图解乱杀算法】113.路径总和Ⅱ

24 阅读1分钟

给你二叉树的根节点 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
输出: []

比起原来的路径总和Ⅰ的题目,要求输出的结果不一样,这次是需要输出路径。

路径总和Ⅰ只需要满足存在这样的一条路径满足节点总和targetSum即可。

而本题需要输出所有满足条件的路径。

所以需要遍历整棵树。中途没有返回值。

题解:

/**
 * 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} targetSum
 * @return {number[][]}
 */
var pathSum = function(root, targetSum) {
    let result = [];
    if(!root)return result;

    var deepDfs = (sum, node, res) => { // res用来记录路径
        if(!node.left && !node.right && sum === 0){
            result.push([...res]); // 要深拷贝一份,避免副作用
            return;
        }
        if(!node.left && !node.right){
            return;
        }

        if(node.left){
            res.push(node.left.val);
            deepDfs(sum - node.left.val, node.left, res)
            res.pop(); // 回溯
        }
        if(node.right){
            res.push(node.right.val);
            deepDfs(sum - node.right.val, node.right, res);
            res.pop();
        }
        return; // 注意递归结束条件,不需要返回值,直接return终止即可
    }
    deepDfs(targetSum - root.val, root, [root.val]); // 这里注意第三个参数需要传根节点的值,不然直接跳过了

    return result;
};