LeetCode第113题: 路径总和 II

206 阅读1分钟

题干

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

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

示例 1:

img

 输入: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:

img

 输入:root = [1,2,3], targetSum = 5
 输出:[]

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/pa… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法: 深度优先+回溯

这道题不同于路径总和1的是这道题需要全部将树遍历一遍,而路经总和1是再符合条件的地方跳出不需要遍历整个。

所以这道题我们需要定义两个数组,一个是用于储存总结果的数组,还有一个就是用来回溯存储当前情况的数组,需要注意的是我们使用的回溯的数组再每次回溯时要将上一个元素删除。

当我们符合路径总和的条件为,当我们当前元素为叶子节点并且并且叶子节点的路径刚好为目标值。

代码实现:

 /**
  * @param {TreeNode} root
  * @param {number} targetSum
  * @return {number[][]}
  */
 var pathSum = function (root, targetSum) {
     var res = [];
     var array = [];
     function doFind(root, targetSum) {
         if (root == null) return;
         targetSum = targetSum - root.val;
         array.push(root.val)
         if (root.left == null && root.right == null && targetSum == 0) {
             res.push([...array]);
         }
         doFind(root.left, targetSum)
         doFind(root.right, targetSum)
         array.pop();
     }
     doFind(root, targetSum);
     return res
 };