返回

深入解析 LeetCode 112:路径总和 - 程序员进阶的必刷题

前端

探索 LeetCode 112:路径总和的算法奥秘

作为一名算法爱好者,你一定对 LeetCode 112:路径总和问题不陌生。这是一个经典问题,要求你在给定二叉树中找到从根节点到叶子节点的路径,该路径上的节点值之和等于目标和。别小看它,它可是包含了算法和数据结构的关键概念,如递归、深度优先搜索和二叉树遍历哦!

破解之道:深度优先搜索

解决 LeetCode 112 的秘密武器就是深度优先搜索(DFS)算法。DFS 就像一个勤奋的小侦探,它沿着每条分支深入探索,直到到达叶子节点或找到目标和,再回溯到父节点继续搜寻。

在 DFS 的帮助下,我们维护一个当前路径和,记录从根节点到当前节点的节点值之和。当我们到达叶子节点时,便检查当前路径和是否等于目标和。若相等,那么 Bingo!我们找到了符合条件的路径。

Python 代码示例

理论归理论,我们还是来看看实际代码吧:

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

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

    left = has_path_sum(root.left, targetSum - root.val)
    right = has_path_sum(root.right, targetSum - root.val)

    return left or right

用例演示

为了更直观地理解,我们来给定一个二叉树:

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

假设目标和为 22,那么从根节点 [5, 4, 11, 2] 形成的路径正好符合要求。我们来用代码验证一下:

# 创建二叉树
root = TreeNode(5)
root.left = TreeNode(4)
root.left.left = TreeNode(11)
root.left.left.left = TreeNode(7)
root.left.left.right = TreeNode(2)
root.right = TreeNode(8)
root.right.left = TreeNode(13)
root.right.right = TreeNode(4)
root.right.right.right = TreeNode(1)

# 目标和
targetSum = 22

# 判断是否存在满足条件的路径
result = has_path_sum(root, targetSum)

# 打印结果
print(f"是否存在满足条件的路径:{result}")

输出结果为:

是否存在满足条件的路径:True

总结

通过使用 DFS 算法,我们可以有效地遍历二叉树,并通过检查路径和来判断是否存在满足条件的路径。解决 LeetCode 112 不仅锻炼了你的算法技能,还加深了对二叉树和 DFS 的理解。

常见问题解答

  1. DFS 和广度优先搜索(BFS)有什么区别?

DFS 是深度优先,沿着每个分支深入探索,而 BFS 是广度优先,一层一层地扩展。

  1. DFS 适用于哪些场景?

DFS 适用于树形结构的遍历,如二叉树、目录结构等。

  1. DFS 在 LeetCode 中的应用有哪些?

DFS 在 LeetCode 中被广泛用于解决路径、子树、回溯等问题。

  1. 如何优化 DFS 算法?

可以通过剪枝(如避免重复访问)和记忆化(如保存中间结果)来优化 DFS。

  1. LeetCode 112 中的路径和是如何计算的?

路径和从根节点开始,累加每个节点的值,直到到达叶子节点。