题目
给你二叉树的根节点 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 } } };