做好每一件事,读好每一本书,天道酬勤
路径总和
2022-01-14 / 4 min read

计算二叉树路径上的和,是不是等于目标值。

题目

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