力扣题目链接[1]
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
示例1:
输入:root = [1,2,3], targetSum = 5
输出:false
解释:树中存在两条根节点到叶子节点的路径:
(1 --> 2): 和为 3
(1 --> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。
提示:
[0, 5000]
内-1000 <= Node.val <= 1000
-1000 <= targetSum <= 1000
思路:
本题采用递归的思路实现。
递归终止条件是,如果当前节点为空,则直接返回false
。如果当前节点存在,但是不存在左右子节点,其实就是叶子节点。则判断当前节点的值是否等于第二个参数目标值。如果相等,则意味着存在这么一条路径,否则表示此路不通。
如果当前节点不是叶子节点,那么就递归处理左右子节点。此时需要将第二个参数减去当前节点的值,更新目标值,方便后续判断。这里采用短路运算进行递归,只要找到一条路径,则提前返回。
/**
* @param {TreeNode} root
* @param {number} targetSum
* @return {boolean}
*/
var hasPathSum = function(root, targetSum) {
if (!root) return false; // 递归终止条件
if (!root.left && !root.right) return root.val === targetSum; // 已经是叶子节点,判断与目标数值是否相等即可
targetSum = targetSum - root.val; // 更新目标数值
return hasPathSum(root.left, targetSum) || hasPathSum(root.right, targetSum); // 判断左右子树
};
本题考查递归的应用。这里通过传入第二个参数来实时的更新目标值,方便判断子节点的值是否与最新的目标值相等,如果相等,则意味着存在一条路径,路径之和等于目标数值。剩下的就是不断回溯,并通过短路运算提前返回。
[1]
力扣题目链接: https://leetcode-cn.com/problems/path-sum/