返回

力扣题解 | LeetCode112. 路径总和 | 通俗易懂的DFS算法

前端

前言

LeetCode 112:路径总和是一个经典的二叉树问题,考察了你的算法思维和编程能力。为了解决这个问题,你需要掌握深度优先搜索(DFS)算法。DFS 是一种广泛用于遍历树形结构的算法,它通过递归的方式从根节点开始,逐层探索树中的每个节点及其子节点,直到到达叶子节点或满足某个特定条件。

算法流程

  1. 递归定义:

    • 如果当前节点为空,则返回 false,因为不存在从当前节点到叶子节点的路径。
    • 如果当前节点是叶子节点(即没有子节点),并且当前节点的值等于目标和,则返回 true,因为从当前节点到自身形成了一条路径,且路径上所有节点值之和等于目标和。
    • 否则,继续遍历当前节点的左子树和右子树。如果左子树或右子树存在从根节点到叶子节点的路径,且路径上所有节点值之和等于目标和,则返回 true,否则返回 false。
  2. 递归出口:

    • 当到达叶子节点时,递归终止。
    • 当遍历完所有节点时,递归终止。
  3. 时间复杂度:

    • 最坏情况下,DFS 需要遍历所有节点,因此时间复杂度为 O(n),其中 n 为二叉树的节点数。

代码实现

def hasPathSum(root, targetSum):
    """
    :type root: TreeNode
    :type targetSum: int
    :rtype: bool
    """
    if not root:
        return False

    if not root.left and not root.right:
        return root.val == targetSum

    return hasPathSum(root.left, targetSum - root.val) or hasPathSum(root.right, targetSum - root.val)

举例说明

给定一棵二叉树,如下所示:

        5
       / \
      4   8
     /   / \
    11  13  4
   /  \      \
  7    2      1

目标和为 22。

从根节点 5 开始,我们可以沿着以下路径到达叶子节点 1:

5 -> 4 -> 11 -> 7 -> 2 -> 1

路径上所有节点值之和为 5 + 4 + 11 + 7 + 2 + 1 = 30,不等于目标和 22,因此不存在从根节点到叶子节点的路径,使得路径上所有节点值之和等于目标和。

扩展阅读

总结

在本文中,我们详细介绍了如何使用深度优先搜索(DFS)算法来解决 LeetCode 112:路径总和问题。我们从算法流程、代码实现和举例说明三个方面对 DFS 算法进行了全面的讲解。希望这篇博文能够帮助你理解和掌握 DFS 算法,并将其应用于解决更多类似的问题。