剑指 Offer 34. 二叉树中和为某一值的路径 - 113. 路径总和 II | 算法

98 阅读1分钟

这是我参与「第四届青训营 」笔记创作活动的的第17天

剑指 Offer 34. 二叉树中和为某一值的路径

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

 

提示:

  • 树中节点总数在范围 [0, 5000] 内
  • -1000 <= Node.val <= 1000
  • -1000 <= targetSum <= 1000

注意:本题与主站 113 题相同:leetcode-cn.com/problems/pa…

方法一: 回溯,遍历节点,把当前节点的值加入总值,看是否满足路径条件,否则继续遍历左子结点和右子结点

var pathSum = function (root, sum) {
    if (!root) return []
    let curSum = 0
    let res = []
    let path = []
    findPath(root, sum, curSum, res, path)
    return res
};
var findPath = function (root, sum, curSum, res, path) {
    path.push(root.val)
    curSum += root.val
    if (curSum === sum && !root.left && !root.right) {
        res.push(path.slice(0))
    }
    if (root.left) {
        findPath(root.left, sum, curSum, res, path)
    }
    if (root.right) {
        findPath(root.right, sum, curSum, res, path)
    }
    path.pop()
}

方法二:深度优先遍历 深度搜索所有从根节点到叶结点的路径 注意,当满足结果的路径时,深拷贝path副本,而不是path本身 因为在js中,参数是值传递,当参数是引用类型时,是复制参数的地址

var pathSum = function(root, sum) {
    let arr = [];
    let path = [];
    dfs(root,  path, arr, sum);
    return arr;
};

function dfs(root, path, arr, sum) {
    if(!root) return;
    path.push(root.val);
    if(root.val == sum && root.left == null && root.right == null) {
        arr.push([...path]);
    }
    dfs(root.left, path, arr, sum - root.val);
    dfs(root.right, path, arr, sum - root.val);
    path.pop();
}