前端算法-路径总和

261 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情

题目

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

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

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

题解

这里我们可以使用递归的方式进行实现,我们在函数中先声明一个sum变量,用于记录当前累加的node节点,在声明一个flag变量,用于阻断递归函数的执行,默认值为false,在声明一个dfs函数,接收一个入参node,进入dfs函数中先判断当前的出参node是否为空或者当前的flag变量是否为true如果满足其一则直接返回。如果不满足则将当前出参nodeval属性与sum变量相加并且赋值给sum变量,接下来判断当前出参node左节点和右节点是否都为null以及当前的sum变量是否等于出参targetSum,如果满足判断条件则将flag变量赋值为true,这样就会直接阻断递归函数的后续执行,接下来在把出参node的左节点和右节点分别传给自身进行调用实现递归,然后在判断当前flag变量是否为false,如果满足判断条件则将sum变量与当前的出参node中的val属性值进行相减在赋值给sum变量,然后将出参root传递给dfs函数并调用,最后将flag变量值返回

/**
 * @param {TreeNode} root
 * @param {number} targetSum
 * @return {boolean}
 */
var hasPathSum = function(root, targetSum) {
    let sum = 0;
    let flag = false;
    dfs(root);
    return flag;
     function dfs(node) {
        if (!node || flag) {
            return
        }
        sum = sum + node.val
        if (node.left === null && node.right === null && sum === targetSum){
             flag = true
        }
        dfs(node.left)
        dfs(node.right)
        if (flag == false) {
            sum = sum - node.val
        }
    }
};

坚持努力,无惧未来!