📌  相关文章
📜  二叉搜索树中具有给定范围值的节点总和(1)

📅  最后修改于: 2023-12-03 15:36:03.182000             🧑  作者: Mango

二叉搜索树中具有给定范围值的节点总和

二叉搜索树(Binary Search Tree,简称 BST)是一种重要的数据结构,它具有以下性质:

  • 左子树中所有节点的值小于根节点的值;
  • 右子树中所有节点的值大于根节点的值;
  • 左右子树也分别是 BST。

二叉搜索树的这些性质使得在 BST 上进行查找操作非常高效。在某些场景下,我们需要在 BST 上查找具有给定范围值的节点,然后求出它们的节点总和。

问题描述

给定一颗 BST 的根节点和两个整数 lowhigh,求 BST 中所有节点值位于 [low, high] 区间内的节点之和。

解决方案
方法一:深度优先搜索

由于 BST 的性质,我们可以采用深度优先搜索(Depth-First Search,简称 DFS)来遍历 BST,并记录满足条件的节点的值之和。具体地,从 BST 的根节点开始,如果当前节点的值小于 low,则进入右子树进行搜索;如果当前节点的值大于 high,则进入左子树进行搜索;如果当前节点的值位于 [low, high] 区间内,则将它的值累加到总和中,并同时进入左右子树进行搜索。

下面是 DFS 的代码实现:

class Solution:
    def rangeSumBST(self, root: TreeNode, low: int, high: int) -> int:
        def dfs(node: TreeNode):
            if not node:
                return 0
            if node.val < low:
                return dfs(node.right)
            if node.val > high:
                return dfs(node.left)
            return node.val + dfs(node.left) + dfs(node.right)
        
        return dfs(root)
方法二:广度优先搜索

我们也可以采用广度优先搜索(Breadth-First Search,简称 BFS)来遍历 BST,并记录满足条件的节点的值之和。具体地,我们使用队列来存储 BFS 的中间结果,初始时将队列中加入 BST 的根节点。每次从队列头部取出一个节点,如果它的值小于 low,则将它的右子树加入队列;如果它的值大于 high,则将它的左子树加入队列;如果它的值位于 [low, high] 区间内,则将它的值累加到总和中,并同时将它的左右子树加入队列。

下面是 BFS 的代码实现:

class Solution:
    def rangeSumBST(self, root: TreeNode, low: int, high: int) -> int:
        queue = collections.deque([root])
        res = 0
        while queue:
            node = queue.popleft()
            if not node:
                continue
            if node.val < low:
                queue.append(node.right)
            elif node.val > high:
                queue.append(node.left)
            else:
                res += node.val
                queue.append(node.left)
                queue.append(node.right)
        return res
总结

在 BST 上查找具有给定范围值的节点,然后求出它们的节点总和,可以采用深度优先搜索或广度优先搜索进行解决。这两种方法的时间复杂度都是 $O(n)$,其中 $n$ 是 BST 中节点的个数。我们可以根据具体的场景选择其中一种方法进行实现。