113. 路径总和 II回溯Normal
Posted pre_eminent
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了113. 路径总和 II回溯Normal相关的知识,希望对你有一定的参考价值。
难度中等
给你二叉树的根节点 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;
以上是关于113. 路径总和 II回溯Normal的主要内容,如果未能解决你的问题,请参考以下文章