力扣【二叉树专题】👊 113. 路径总和 II

160 阅读2分钟

「这是我参与2022首次更文挑战的第 28 天,活动详情查看:2022首次更文挑战

题目链接

113. 路径总和 II - 力扣(LeetCode) (leetcode-cn.com)

题目描述

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。 是指没有子节点的节点。

测试用例

示例 1:

image.png

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]

题目分析

在最近做的题目里,有这么一个题: # 112. 路径总和,同样的前置条件,但只需要我们求是否存在一个从根节点到最下子节点的值之和为目标值。但本题对此要求提高:需要判断是否存在,在存在的情况下,需要记录下途中每个节点的值

我们使用 arrs 存储每种符合要求的节点值数组,并在最后返回为题目所求数据。在树递归遍历之前,定义 sum 为节点值的累计之和,arr 存储使用到的节点的单个值

我们对树进行常规的递归遍历,代码框架如下:

trave(node);
function trave(node){
    if(node==null)return;
    trave(node.left);
    trave(node.right);
}

每遍历到一个非空节点,我们将节点的值分别添加到 sum, arr,但是,当我们遍历这个节点的左右子节点后,准备的回溯的那个时间节点,我们需要将节点的值,从 sum, arr 中移除

sum, arr 添加节点的值之后,并且是在 sum, arr 移除节点的值之前这个时间节点,添加对当前节点的判断:如果当前节点没有子节点,即此节点为末端节点,若此时 sum == targetSum,则我们需要将此时的 arr 存储到 arrs 表示组合目标值的一种合规的方式

在将 arr 存储到 arrs 的时候,直接存入则是存入的 arr 的引入,会影响到结果,我们需要将那个时间节点的 arr 数组,完整的复制一份到 arrs

代码实现

var pathSum = function(root, targetSum) {
    let arrs = [];
    let arr = [],
        sum = 0;
    trave(root);
    return arrs;

    function trave(node) {
        if (node == null) return;
        let val = node.val;
        sum += val;
        arr.push(val);
        if (node.left == null && node.right == null && sum == targetSum) {
            arrs.push([...arr]);
        }
        trave(node.left);
        trave(node.right);
        arr.pop();
        sum -= val
    }
};

image.png