返回

征服 LeetCode 112:踏上追寻路径之谜的非凡之旅

前端

亲爱的读者,欢迎来到 LeetCode 112 的奇幻世界。今天,我们将开启一场激动人心的冒险,探索二叉树的奥秘,并寻找隐藏在其中的一条特别路径。让我们踏上追寻路径之谜的非凡旅程。

二叉树与路径总和的相遇

想象一下,你正置身于一棵枝繁叶茂的二叉树中,每一棵子树都代表了一个不同的选择,每一个节点都蕴藏着不同的价值。你的任务是寻找一条从根节点到叶子节点的路径,在这条路径上,所有节点的值加起来等于一个给定的目标和。

深度优先搜索(DFS)与回溯

为了完成这个挑战,我们将使用深度优先搜索(DFS)算法。DFS 是一种遍历二叉树的有效方法,它沿着一条路径向下探索,直到到达叶子节点。如果在当前路径上,节点值之和等于目标和,那么我们就找到了目标路径。否则,我们就回溯到上一个节点,尝试其他路径。

算法步骤:

  1. 从根节点开始,将其添加到栈中。
  2. 从栈中弹出节点并将其值添加到路径总和中。
  3. 检查当前路径总和是否等于目标和。如果相等,则返回 true
  4. 否则,继续探索该节点的左子节点和右子节点。
  5. 如果左右子节点都探索完毕,则从栈中弹出该节点并将其路径总和减去该节点的值。
  6. 重复步骤 2 到 5,直到找到目标路径或探索完所有节点。

编码与示例

def has_path_sum(root, target_sum):
    """
    判断是否存在路径和为 target_sum 的路径

    参数:
        root: 二叉树的根节点
        target_sum: 目标和

    返回:
        布尔值,表示是否存在路径和为 target_sum 的路径
    """

    # 栈,用于存储路径上的节点
    stack = [root]
    # 路径总和
    path_sum = 0

    while stack:
        # 从栈中弹出节点
        node = stack.pop()
        # 将节点值添加到路径总和
        path_sum += node.val

        # 检查当前路径总和是否等于目标和
        if not node.left and not node.right and path_sum == target_sum:
            return True

        # 继续探索该节点的左子节点和右子节点
        if node.left:
            stack.append(node.left)
        if node.right:
            stack.append(node.right)

        # 如果左右子节点都探索完毕,则从栈中弹出该节点并将其路径总和减去该节点的值
        if not node.left and not node.right:
            path_sum -= node.val

    # 探索完所有节点,未找到目标路径
    return False

总结

LeetCode 112 是一道经典的二叉树算法题,涉及到 DFS 和回溯等重要算法思想。通过这道题的练习,你将对二叉树的遍历和搜索有更深入的理解,并掌握解决此类问题的基本方法。希望你能享受这段旅程,并从中有所收获。