【JS每日一算法】🟩106.路径总和(深度优先)

314 阅读1分钟

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

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

提示:

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

示例 1:

image.png

输入: root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出: true
解释: 等于目标和的根节点到叶节点路径如上图所示。

示例 2:

image.png

输入: root = [1,2,3], targetSum = 5
输出: false
解释: 树中存在两条根节点到叶子节点的路径:
(1 --> 2): 和为 3
(1 --> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。

题解:

个人博客

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


/**
 * @description: 深度优先  TC:O(n)  SC:O(1)
 * @author: JunLiangWang
 * @param {*} root  给定树的根节点
 * @param {*} targetSum 给定目标和整数
 * @return {*}
 */
function dfs(root,targetSum){
    /**
     * 本方案使用深度优先的方式,利用深度遍历树的节点
     * 并记录到达该节点的路径和,然后当遇到叶子节点则
     * 比较路径和是否与目标值相等,相等则满足题意返回
     * true,否则继续遍历其他节点,直到遍历完成所有节
     * 点。
     */

    // 如果节点为空,直接返回false
    if(!root)return false
    // 记录结果,初值为fasle
    let result=false;

    /**
     * @description: 利用递归实现深度遍历
     * @author: JunLiangWang
     * @param {*} root 当前根节点
     * @param {*} val  到达根节点的路径和
     * @return {*}
     */    
    function recursion(root,val){
        // 如果节点为空或已找到目标值,则直接返回val
        if(!root||result){
            return val
        }
        // 计算到达该节点的路径和
        let sum=val+root.val;
        // 当前为叶子节点且其路径和等于目标值,则满足要求
        if(!root.left&&!root.right&&sum==targetSum)result=true
        // 深度遍历左右节点
        recursion(root.left,sum)
        recursion(root.right,sum)
    }
    // 执行递归
    recursion(root,0)
    // 返回结果
    return result
}