返回
力扣题解 | LeetCode112. 路径总和 | 通俗易懂的DFS算法
前端
2023-10-31 06:18:30
前言
LeetCode 112:路径总和是一个经典的二叉树问题,考察了你的算法思维和编程能力。为了解决这个问题,你需要掌握深度优先搜索(DFS)算法。DFS 是一种广泛用于遍历树形结构的算法,它通过递归的方式从根节点开始,逐层探索树中的每个节点及其子节点,直到到达叶子节点或满足某个特定条件。
算法流程
-
递归定义:
- 如果当前节点为空,则返回 false,因为不存在从当前节点到叶子节点的路径。
- 如果当前节点是叶子节点(即没有子节点),并且当前节点的值等于目标和,则返回 true,因为从当前节点到自身形成了一条路径,且路径上所有节点值之和等于目标和。
- 否则,继续遍历当前节点的左子树和右子树。如果左子树或右子树存在从根节点到叶子节点的路径,且路径上所有节点值之和等于目标和,则返回 true,否则返回 false。
-
递归出口:
- 当到达叶子节点时,递归终止。
- 当遍历完所有节点时,递归终止。
-
时间复杂度:
- 最坏情况下,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 算法,并将其应用于解决更多类似的问题。