目录
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
提示:
树中节点的数目在范围 [0, 5000] 内
-1000 <= Node.val <= 1000
-1000 <= targetSum <= 1000
示例1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。
示例2:
输入:root = [1,2,3], targetSum = 5
输出:false
解释:树中存在两条根节点到叶子节点的路径:
(1 --> 2): 和为 3
(1 --> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。
示例3:
输入:root = [], targetSum = 0
输出:false
解释:由于树是空的,所以不存在根节点到叶子节点的路径。
我一开始看到这道题示例中二叉树图片和输入的root数组是懵逼的,root数组是怎么转成图片所示的二叉树的呢?
后面一看leetcode的的编辑器的提示代码
搞了半天,hasPathSum的入参root不是示例输入中给的数组,而是直接传了生成好的二叉树对象。吓我一跳,虚惊一场。
那么接下来就是处理路径总和的问题了,其实思路也很简单,从根节点的开始比较root.val 和 targetSum的值,如果不相等,则继续递归遍历root.left,和root.right,即将root.left和root.right当成新的根节点,但是此时targetSum = targetSum - root.val,如此递归比较,如果最终都不存在相等的情况,则返回false,如果存在相等了,则此时不能直接返回true,因为题目要求是:
是否存在 根节点到叶子节点 的路径。
叶子节点 是指没有子节点的节点。
因此,如果发现相等情况,则还要判断发生相等的节点是否为叶子节点,若不是,则也不能算合理路径。
比如
root = [1,2]
targetSum = 1
咋一看,似乎应该返回true,因为1可以自身当成全部路径的化,其targetSum就是1,但是可惜的是1不是叶子节点。
- /**
- * 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
- if(!root.left && !root.right) {
- return root.val === targetSum
- }
- targetSum = targetSum - root.val
-
- return hasPathSum(root.left, targetSum) || hasPathSum(root.right, targetSum)
- };
注意,上面代码只能在leetCode编辑器中运行,因为上面函数root入参不是示例中的数组,而是leetcode后台帮我们生成好的二叉树对象