计算二叉树路径上的和,是不是等于目标值。
题目
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
示例 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
解释:由于树是空的,所以不存在根节点到叶子节点的路径。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/path-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
这一个题目的思路不是很难,只是需要判断的东西会多一些,但是总体来说还是简单的。
这里我们还是使用递归来解答这个题目,使用的方法还是递归的三步骤
解题
首先确认须传入的参数和返回的参数值
这个题目最终是要判断是不是符合条件,所以我们的返回值我们用bool类型。因为我们还是对节点进行操作,所以我们传入的参数也就是节点,因为我们还要进行数值的判断,所以我们还要传入这个需要比对的值。
trave(root *TreeNode,targetSum int)bool
确定终止条件
这里我们的终止条件就是看到最后叶子节点的时候,我们最后得到的值是是不是对应的值
也就是:
if root.Left == nil&& root.Right == nil&& targetSum == 0{
return true
}
if root.Left == nil&& root.Right == nil{
return false
}
确定单层逻辑
这里我们确认一些单层的逻辑,也就是在这里我们用到了回溯的思想,如果我们没有找到相应的路径我们就回溯然后再次寻找,直到确认返回为止。
if root.Left != nil{
targetSum = targetSum - root.Left.Val
if trave(root.Left,targetSum){
return true
}
targetSum = targetSum + root.Left.Val
}
if root.Right != nil {
targetSum = targetSum-root.Right.Val
if trave(root.Right,targetSum){
return true
}
targetSum = targetSum+root.Right.Val
}
return false
解题源码
最后我们通过上面的步骤得到了最终的代码;
func hasPathSum(root *TreeNode, targetSum int) bool {
if root == nil{
return false
}
return trave(root,targetSum-root.Val)
}
func trave(root *TreeNode,targetSum int)bool{
if root.Left == nil&& root.Right == nil&& targetSum == 0{
return true
}
if root.Left == nil&& root.Right == nil{
return false
}
if root.Left != nil{
targetSum = targetSum - root.Left.Val
if trave(root.Left,targetSum){
return true
}
targetSum = targetSum + root.Left.Val
}
if root.Right != nil {
targetSum = targetSum-root.Right.Val
if trave(root.Right,targetSum){
return true
}
targetSum = targetSum+root.Right.Val
}
return false
}