返回
深入解析 LeetCode 112:路径总和 - 程序员进阶的必刷题
前端
2023-11-07 18:29:59
探索 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 的理解。
常见问题解答
- DFS 和广度优先搜索(BFS)有什么区别?
DFS 是深度优先,沿着每个分支深入探索,而 BFS 是广度优先,一层一层地扩展。
- DFS 适用于哪些场景?
DFS 适用于树形结构的遍历,如二叉树、目录结构等。
- DFS 在 LeetCode 中的应用有哪些?
DFS 在 LeetCode 中被广泛用于解决路径、子树、回溯等问题。
- 如何优化 DFS 算法?
可以通过剪枝(如避免重复访问)和记忆化(如保存中间结果)来优化 DFS。
- LeetCode 112 中的路径和是如何计算的?
路径和从根节点开始,累加每个节点的值,直到到达叶子节点。