返回
算法之道:LeetCode 113 路径总和 II
闲谈
2023-10-07 23:20:07
探索算法王国的奇妙旅程,我们踏上 LeetCode 113 路径总和 II 的探险。在这个问题中,你将面对一棵二叉树和一个目标和,你的任务是找到从根节点到叶子节点的所有路径,这些路径上的节点值之和正好等于目标和。
二叉树,这种数据结构就像一棵倒置的树,每个节点可以拥有最多两个子节点,分别称为左子节点和右子节点。叶子节点则是没有子节点的节点,就像树叶一样。
路径总和,顾名思义,就是从树的根节点出发,沿途经过的节点值之和。在这个问题中,我们寻找的是所有从根节点到叶子节点的路径,这些路径上的节点值之和正好等于给定的目标和。
让我们以一个示例来理解这个问题。假设我们有一棵二叉树:
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
目标和为 22。从根节点 5 出发,有两条路径满足条件:
- 5 -> 4 -> 11 -> 2
- 5 -> 8 -> 4 -> 5
算法原理
为了解决这个问题,我们可以使用深度优先搜索(DFS)算法。DFS 是一种递归算法,它通过深度遍历树中的节点来找到所有可能的路径。
在 DFS 过程中,我们维护一个路径列表,该列表存储从根节点到当前节点的路径。每当我们访问一个节点时,我们将其添加到路径列表中,并检查路径的总和是否等于目标和。如果是,我们将此路径添加到结果列表中。否则,我们将继续 DFS 其左子节点和右子节点。
代码实现
def pathSum(root, targetSum):
result = []
path = []
dfs(root, targetSum, path, result)
return result
def dfs(root, target, path, result):
if not root:
return
path.append(root.val)
if not root.left and not root.right and sum(path) == target:
result.append(path.copy())
dfs(root.left, target, path, result)
dfs(root.right, target, path, result)
path.pop()
总结
LeetCode 113 路径总和 II 问题是一个经典的算法问题,它考验了我们的深度优先搜索和递归技能。通过对问题进行仔细分析和算法设计,我们可以找到所有从根节点到叶子节点的路径,这些路径上的节点值之和正好等于给定的目标和。