返回

LeetCode双题一解:路径总和与根节点到叶节点数字之和探索(深度优先搜索)

前端

LeetCode 112:路径总和

题目

给定一个二叉树和一个目标和,判断该二叉树中是否存在从根节点到叶节点的路径,其结点值之和等于给定的目标和。

递归算法(深度优先搜索):

核心思路:
  1. 从根节点开始,对二叉树进行深度优先搜索。
  2. 在每个结点处,将当前结点的值与目标和进行比较,如果相等,则找到一条路径。
  3. 如果当前结点的左子树或右子树不为空,则继续递归搜索该子树。
实现步骤:
  1. 定义一个递归函数hasPathSum(),接受三个参数:当前结点root、当前路径和sum、目标和targetSum
  2. 如果当前结点为空,则返回False
  3. 如果当前结点的左子树或右子树不为空,则继续递归搜索该子树。
  4. 如果当前结点的左子树和右子树都为空,且当前路径和等于目标和,则返回True
  5. 否则,返回False
代码实现:
def hasPathSum(root, sum, targetSum):
    if not root:
        return False

    # 如果当前结点的左子树或右子树不为空,则继续递归搜索该子树。
    if root.left:
        if hasPathSum(root.left, sum + root.left.val, targetSum):
            return True
    if root.right:
        if hasPathSum(root.right, sum + root.right.val, targetSum):
            return True

    # 如果当前结点的左子树和右子树都为空,且当前路径和等于目标和,则返回True。
    if not root.left and not root.right and sum + root.val == targetSum:
        return True

    # 否则,返回False。
    return False

LeetCode 129:求根节点到叶节点数字之和

题目:

给定一个二叉树,其中每个节点的值为0到9。每个根节点到叶节点的路径都可以用一个数字表示。例如,从根节点到叶节点的路径1->2->3可以表示为一个数字123。

计算从根节点到叶节点的数字之和。

递归算法(深度优先搜索):

核心思路:
  1. 从根节点开始,对二叉树进行深度优先搜索。
  2. 在每个结点处,将当前结点的值添加到当前路径和中。
  3. 如果当前结点的左子树或右子树不为空,则继续递归搜索该子树。
  4. 如果当前结点的左子树和右子树都为空,则将当前路径和添加到总路径和中。
实现步骤:
  1. 定义一个递归函数sumNumbers(),接受三个参数:当前结点root、当前路径和sum、总路径和totalSum
  2. 如果当前结点为空,则返回0
  3. 如果当前结点的左子树或右子树不为空,则继续递归搜索该子树。
  4. 如果当前结点的左子树和右子树都为空,则将当前路径和添加到总路径和中。
  5. 返回总路径和。
代码实现:
def sumNumbers(root):
    def dfs(root, sum):
        if not root:
            return 0

        # 如果当前结点的左子树或右子树不为空,则继续递归搜索该子树。
        if root.left:
            dfs(root.left, sum * 10 + root.left.val)
        if root.right:
            dfs(root.right, sum * 10 + root.right.val)

        # 如果当前结点的左子树和右子树都为空,则将当前路径和添加到总路径和中。
        if not root.left and not root.right:
            totalSum[0] += sum * 10 + root.val

    totalSum = [0]
    dfs(root, 0)
    return totalSum[0]

总结

通过对LeetCode 112:路径总和和129:求根节点到叶节点数字之和的两道题进行深度剖析,您已经掌握了使用深度优先搜索和队列来解决该类问题的思路和方法。在未来的刷题和算法实践中,您可以灵活应用这些技巧,快速解决更多难题。