返回
征服 LeetCode 112:踏上追寻路径之谜的非凡之旅
前端
2023-10-27 00:08:50
亲爱的读者,欢迎来到 LeetCode 112 的奇幻世界。今天,我们将开启一场激动人心的冒险,探索二叉树的奥秘,并寻找隐藏在其中的一条特别路径。让我们踏上追寻路径之谜的非凡旅程。
二叉树与路径总和的相遇
想象一下,你正置身于一棵枝繁叶茂的二叉树中,每一棵子树都代表了一个不同的选择,每一个节点都蕴藏着不同的价值。你的任务是寻找一条从根节点到叶子节点的路径,在这条路径上,所有节点的值加起来等于一个给定的目标和。
深度优先搜索(DFS)与回溯
为了完成这个挑战,我们将使用深度优先搜索(DFS)算法。DFS 是一种遍历二叉树的有效方法,它沿着一条路径向下探索,直到到达叶子节点。如果在当前路径上,节点值之和等于目标和,那么我们就找到了目标路径。否则,我们就回溯到上一个节点,尝试其他路径。
算法步骤:
- 从根节点开始,将其添加到栈中。
- 从栈中弹出节点并将其值添加到路径总和中。
- 检查当前路径总和是否等于目标和。如果相等,则返回
true
。 - 否则,继续探索该节点的左子节点和右子节点。
- 如果左右子节点都探索完毕,则从栈中弹出该节点并将其路径总和减去该节点的值。
- 重复步骤 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 和回溯等重要算法思想。通过这道题的练习,你将对二叉树的遍历和搜索有更深入的理解,并掌握解决此类问题的基本方法。希望你能享受这段旅程,并从中有所收获。