返回

算法每日一题之 LeetCode 112: 路径总和

人工智能

导言

在 LeetCode 112 题中,我们的目标是找出给定二叉树中从根节点到叶节点的路径,其中每个路径的和都等于一个指定的 targetSum。为了解决这个问题,我们可以采用深度优先搜索(DFS)算法,通过递归的方式遍历这棵树的所有根结点到叶结点的路径。

算法原理

深度优先搜索是一种遍历树或图的算法,它沿着一條路径深入搜索,直到无法继续深入,然后再返回并探索其他分支。在这个问题中,我们将使用递归函数来实现 DFS,每次函数调用都将深入树的一层。

递归函数

我们的递归函数将接收两个参数:

  • node:当前正在探索的结点。
  • targetSum:我们希望路径和等于的目标值。

函数首先检查 node 是否为 None,如果是,则表示我们已经到达了叶子结点,可以返回。否则,函数将检查当前路径的和是否等于 targetSum,如果是,则返回 True。

如果不是,函数将继续递归探索 node 的左子树和右子树,将 targetSum 减去 node 的值作为新的 targetSum。如果任一子树的递归调用返回 True,函数也将返回 True。

实现

以下是 Python 代码的实现:

def has_path_sum(root, targetSum):
  if not root:
    return False

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

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

复杂度分析

DFS 算法的时间复杂度为 O(N),其中 N 是树中的结点数。这是因为该算法将访问树中的每个结点一次。空间复杂度为 O(H),其中 H 是树的高度,这是因为递归函数调用栈的深度不会超过树的高度。

示例

考虑以下二叉树:

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

如果目标和为 22,那么满足条件的路径是:

  • 5 -> 4 -> 11 -> 2
  • 5 -> 8 -> 4 -> 5

我们的递归函数将返回 True。

结论

本篇文章介绍了使用 Python 语言解决 LeetCode 112 题的算法和实现。通过深度优先搜索和递归,我们可以高效地识别给定二叉树中满足特定路径和的路径。这篇文章提供了清晰的解释和示例,希望对读者理解这一算法有所帮助。