难度中等
给你二叉树的根节点 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
思路:
1. 回溯函数的递归终点:到达叶子节点时,如果path路径总和等于target,加入结果集
2. 节点存在,才做出选择,加入path,进入下一层
3. 先对左子节点做选择;再对右子节点做选择
解答:
/**
* 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) {
// 节点存在,才能进入回溯环节
if(root === null){
return [];
}
let path = [];
let res = [];
// 先把根节点加进来
path.push(root);
backtrack(root, targetSum, path, res);
return res;
};
function backtrack(root, targetSum, path, res){
// 递归终点,到达叶子
if(root.left === null && root.right === null && isEqual(path, targetSum)){
// 对象数组 转成 值
let tmpArr = [];
path.forEach(node => {
tmpArr.push(node.val);
})
res.push(tmpArr);
return;
}
// 先遍历左子树
if(root.left !== null){
// 存在左子树,才作出选择
path.push(root.left);
// 进入下一层
backtrack(root.left, targetSum, path, res);
// 撤销选择
path.pop();
}
// 再遍历右子树
if(root.right !== null){
// 存在右子树,才作出选择
path.push(root.right);
// 进入下一层
backtrack(root.right, targetSum, path, res);
// 撤销选择
path.pop();
}
}
function isEqual(arr, targetSum){
let sum = 0;
arr.forEach(node => {
sum += node.val;
})
return sum === targetSum;
}