题目
给你二叉树的根节点 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如果满足其一则直接返回。如果不满足则将当前出参node的val属性与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 } } };