112. 路径总和

发布时间 2023-12-11 11:18:36作者: Frommoon

题目

  • 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如 果存在,返回 true ;否则,返回 false 。

法一、DFS

  • 判断当前节点是否为叶子节点,如果是叶子节点,判断当前叶子节点的值是否 = sum 减去之前路径上节点值。
    递归左子树。
    递归右子树。
class Solution(object):
    def hasPathSum(self, root, sum):
        if not root: return False#根节点为空
        if not root.left and not root.right:#若为叶子结点判断sum是否等于当前结点值
            return sum == root.val
        return self.hasPathSum(root.left, sum - root.val) or self.hasPathSum(root.right, sum - root.val)#如果不是叶子结点,递归判断左子树和右子树

法二、回溯

  • 这里的回溯指 利用 DFS 找出从根节点到叶子节点的所有路径,只要有任意一条路径的 和 等于 sum,就返回 True。
class Solution(object):
    def hasPathSum(self, root, sum):
        if not root: return False
        res = [] #选择列表
        return self.dfs(root, sum, res, [root.val])
        
    def dfs(self, root, target, res, path):#传入根节点、目标值、选择列表和路径列表
        if not root: return False
        if sum(path) == target and not root.left and not root.right:#如果当前的路径列表path的和等于目标值,并且当前结点是叶子结点,返回True
            return True
        left_flag, right_flag = False, False
        if root.left:#如果存在左子树(可以避免访问空节点的值属性而导致错误)
            left_flag = self.dfs(root.left, target, res, path + [root.left.val])#递归调用dfs,传入左子树、目标值、选择列表和加上左子节点的路径列表
        if root.right:
            right_flag = self.dfs(root.right, target, res, path + [root.right.val])
        return left_flag or right_flag