【JS每日一算法】🟨107.路径总和II(深度优先)

264 阅读2分钟

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

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

提示:

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

示例 1:

image.png

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

image.png

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

题解:

个人博客

更多JS版本题解点击链接关注该仓库👀

/**
 * @description: 深度优先  TC:O(n)  SC:O(n)
 * @author: JunLiangWang
 * @param {*} root  给定树的根节点
 * @param {*} targetSum 给定目标值
 * @return {*}
 */
function dfs(root,targetSum){
    /**
     * 本方案使用深度优先的方式,该题与112.路径总和类
     * 型, 不过112题只是判断是否存在一条路径和等于给
     * 定目标值,而该题是找出所有等于目标的的路径和,
     * 其实方法上并由没什么差别,我们同样利用深度遍历
     * 树的节点并记录到达该节点的路径和,然后当遇到叶
     * 子节点则比较路径和是否与目标值相等,相等则记录
     * 路径,然后继续遍历其他节点,直到遍历完成所有节
     * 点。
     */

    // 记录满足条件的路径
    let outArray=[];
    /**
     * @description: 递归实现深度优先遍历
     * @author: JunLiangWang
     * @param {*} root  当前根节点
     * @param {*} path  达到当前节点之前的路径
     * @param {*} sum   达到当前节点之前的路径和
     * @return {*}
     */    
    function recursion(root,path,sum){
         // 如果节点为空,直接返回false
         if(!root) return sum
         // 计算到达当前节点的路径和
         let tempSum=sum+root.val,
         // 得出达到当前节点的路径
         tempPath=[...path,root.val];
         // 当前为叶子节点且其路径和等于目标值,则满足要求
         if(tempSum===targetSum&&!root.left&&!root.right)outArray.push(tempPath)
         // 继续深度遍历其他左右节点
         recursion(root.left,tempPath,tempSum);
         recursion(root.right,tempPath,tempSum);
    }
    // 执行递归
    recursion(root,[],0)
    // 返回结果
    return outArray;
}