返回

DFS深度探索:LeetCode 938. 二叉搜索树的范围和

前端

探索二叉搜索树:揭开 LeetCode 938 的奥秘

导航:

  • 深入二叉搜索树的世界
  • LeetCode 938 问题陈述
  • DFS 深度搜索算法
  • 代码示例和注释
  • 实例和逐步解释
  • 总结
  • 常见问题解答

深入二叉搜索树的世界

二叉搜索树(BST)是一种特殊的二叉树,它具备一种独一无二的特性:它的左子树中的所有元素都小于其根节点,而右子树中的所有元素都大于其根节点。这一特性使 BST 在许多计算机科学应用中都非常有用,比如排序、查找和范围查询。

LeetCode 938 问题陈述

LeetCode 938 是一道经典的 BST 问题,它要求我们计算在一个给定的 BST 中,所有介于两个给定值之间的节点值的总和。例如,给定一个 BST [10, 5, 15, 3, 7, 13, 18],并且 low=7,high=15,那么我们应该返回 20,因为在这个 BST 中,介于 7 和 15 之间的节点值为 3、7、10、13,它们的总和为 20。

DFS 深度搜索算法

解决 LeetCode 938 问题最有效的方法之一是使用深度优先搜索(DFS)算法。DFS 是一种遍历树或图的算法,它从根节点开始,然后逐层向下遍历,直到到达叶子节点。DFS 算法非常适合解决 BST 问题,因为它可以利用 BST 的特性来优化搜索过程。

DFS 深度搜索算法步骤:

  1. 从根节点开始。
  2. 如果当前节点的值介于 low 和 high 之间,则将当前节点的值添加到结果和中。
  3. 如果当前节点的值大于 low,则继续搜索左子树。
  4. 如果当前节点的值小于 high,则继续搜索右子树。
  5. 重复步骤 2-4,直到遍历完整个 BST。

代码示例和注释

def range_sum_bst(root, low, high):
    """
    计算给定 BST 中介于两个给定值之间的节点值的总和。

    参数:
    root: 二叉搜索树的根节点
    low: 范围下限
    high: 范围上限

    返回:
    节点值的总和
    """

    if not root:  # 检查空节点
        return 0

    total = 0

    if root.val >= low and root.val <= high:  # 当前节点在范围内
        total += root.val

    if root.val > low:  # 当前节点大于low,向左子树搜索
        total += range_sum_bst(root.left, low, high)

    if root.val < high:  # 当前节点小于high,向右子树搜索
        total += range_sum_bst(root.right, low, high)

    return total

实例和逐步解释

考虑示例 BST [10, 5, 15, 3, 7, 13, 18],low=7,high=15:

  1. 从根节点 10 开始。
  2. 10 大于 7,小于 15,因此将 10 添加到结果中。
  3. 向左子树[5, 3, 7]搜索:
    • 节点 5 小于 7,跳过右子树。
    • 节点 3 大于 7,小于 15,因此将 3 添加到结果中。
    • 节点 7 小于 15,继续右子树搜索。
  4. 向右子树[15, 13, 18]搜索:
    • 节点 15 大于 15,跳过左子树。
    • 节点 13 小于 15,继续右子树搜索。
    • 节点 18 大于 15,跳过左子树。

最终,结果和为 10 + 3 + 7 = 20,与 LeetCode 938 问题中给出的答案一致。

总结

使用 DFS 深度搜索算法可以高效地解决 LeetCode 938 问题,因为它利用了 BST 的特性来优化搜索过程。通过理解 BST 的性质和 DFS 算法的工作原理,我们可以轻松地找到介于两个给定值之间的节点值的总和。

常见问题解答

  1. 如何确定当前节点是否在给定的范围内?

    • 如果当前节点的值大于或等于 low 且小于或等于 high,则该节点在范围内。
  2. 如果给定的范围为空(即 low > high),DFS 算法会如何处理?

    • DFS 算法将返回 0,因为没有任何节点的值介于两个给定值之间。
  3. DFS 算法的复杂度是多少?

    • DFS 算法的时间复杂度为 O(n),其中 n 是 BST 中的节点数。
  4. 除了 DFS,还有其他方法可以解决 LeetCode 938 问题吗?

    • 是的,可以使用广度优先搜索(BFS)算法或迭代算法来解决这个问题。
  5. 如何在代码中处理 BST 为空的情况?

    • 在 DFS 函数的开头检查 root 节点是否为空。如果为空,则返回 0。