返回

算法之道:LeetCode 113 路径总和 II

闲谈

探索算法王国的奇妙旅程,我们踏上 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 问题是一个经典的算法问题,它考验了我们的深度优先搜索和递归技能。通过对问题进行仔细分析和算法设计,我们可以找到所有从根节点到叶子节点的路径,这些路径上的节点值之和正好等于给定的目标和。