这是我参与「第四届青训营 」笔记创作活动的的第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();
}