这是我参与2022首次更文挑战的第33天,活动详情查看:2022首次更文挑战
题目描述
提供一个二叉树,和一个目标整数值targetSum,需要你在二叉树中找到一条路径,从根节点到叶子节点,这条路径的加起来的总和为目标整数值。
如果找得到,则返回true,否则返回false。
如果二叉树没有根节点,则返回false。
用画图来举个例子
目标值:7 存在1->2->5的路径等于目标值,返回true
目标值:8, 不存在路径等于目标值,所以返回false。
思路分析
第一种方法
我们可以对二叉树进行遍历,然后针对每条路径(根节点到叶子节点)求和,如果发现等于目标值,则抛出异常,然后就会被外部的try-catch捕获到
然后 直接返回true即可。这样子可以中断后面的遍历了。
如果遍历结束后还是没有找到,则返回false即可。
主要是通过新建一个sum函数,参数有个num,统计当前路径的和。
如果发现当前节点是叶子节点,就判断当前的路径之和是否等于目标值,是则抛出异常。
如果当前节点不是叶子节点,则把num加上当前节点的val,代表当前的路径的和。
然后继续递归遍历下面的左边树和右边树,传入num。
遍历结束后还是没有等于目标值,返回false即可。
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @param {number} targetSum
* @return {boolean}
*/
var hasPathSum = function (root, targetSum) {
if (!root) return false
try {
function sum (root, num) {
if (!root) return
if (!root.left && !root.right) {
if (num + root.val === targetSum) throw new Error()
}
num = num + root.val
sum(root.left, num)
sum(root.right, num)
}
sum(root, 0)
} catch (error) {
return true
}
return false
};
第二种方法
这个方法思路类似,也是判断当前节点如果是叶子节点去做处理,不过它是通过减法,目标值减去节点的val,如果减为0的时候,就代表找到目标值,返回true。
否则继续遍历节点的左边树和右边树,传入目标值减去当前节点的值,递归遍历。
最后如果减为0就返回true。否则就返回false。
代码如下:
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @param {number} targetSum
* @return {boolean}
*/
var hasPathSum = function (root, targetSum) {
if (!root) return 0
if (!root.left && !root.right) return targetSum - root.val === 0
return hasPathSum(root.left, targetSum - root.val) || hasPathSum(root.right, targetSum - root.val)
};