目录

0112:路径总和

力扣第 112 题

题目

给你二叉树的根节点 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
解释:由于树是空的,所以不存在根节点到叶子节点的路径。

提示:

  • 树中节点的数目在范围 [0, 5000]
  • -1000 <= Node.val <= 1000
  • -1000 <= targetSum <= 1000

分析

#1

令 dfs(u, s) 代表是否存在节点 u 到叶子节点的路径和为 s,即可递归。

1
2
3
4
5
6
7
8
9
class Solution:
    def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
        def dfs(u,s):
            if not u:
                return False
            if not u.left and not u.right:
                return s==u.val
            return dfs(u.left,s-u.val) or dfs(u.right,s-u.val)
        return  dfs(root,targetSum)

42 ms

#2

也可以遍历树,维护当前节点到根节点的路径和。遇到叶子节点时,判断是否满足即可。

解答

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
class Solution:
    def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
        sk = [(root,0)] if root else []
        while sk:
            u,s = sk.pop()
            if u:
                s += u.val
                if not u.left and not u.right and s==targetSum:
                    return True
                sk.extend([(u.right,s),(u.left,s)])
        return False

43 ms