📌  相关文章
📜  计算位于给定范围内的BST节点(1)

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

计算位于给定范围内的BST节点

二叉搜索树(Binary Search Tree,BST)是一种有序的树,它满足任意节点的键值大于左子树中的任意节点的键值,小于右子树中的任意节点的键值。在 BST 中搜索一个值的时间复杂度为 O(log n),其中 n 是 BST 中的节点个数。

本文将讨论如何计算 BST 中位于给定范围内的节点数量。

实现思路

计算位于给定范围内的节点数量,可以通过遍历 BST 并统计符合条件的节点数量来完成。

具体实现可以采用深度优先遍历(Depth First Search,DFS)或广度优先遍历(Breadth First Search,BFS)。

对于 DFS,可以采用中序遍历(Inorder Traversal),按照节点键值的顺序依次遍历整个 BST 并统计符合条件的节点数量。

对于 BFS,可以采用层次遍历(Level Order Traversal),从根节点开始逐层遍历 BST 并统计符合条件的节点数量。

代码示例

下面是使用 DFS 和 BFS 实现计算位于给定范围内的节点数量的示例代码:

# 使用 DFS 实现计算位于给定范围内的节点数量
class Solution:
    def rangeSumBST(self, root: TreeNode, low: int, high: int) -> int:
        def dfs(node):
            if not node:
                return 0
            if node.val < low:
                return dfs(node.right)
            elif node.val > high:
                return dfs(node.left)
            else:
                return node.val + dfs(node.left) + dfs(node.right)
        return dfs(root)
        
# 使用 BFS 实现计算位于给定范围内的节点数量
class Solution:
    def rangeSumBST(self, root: TreeNode, low: int, high: int) -> int:
        if not root:
            return 0
        queue = [root]
        res = 0
        while queue:
            node = queue.pop(0)
            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

其中,dfs 函数表示遍历以 node 为根节点的子树,并统计其中符合条件的节点数量。具体实现中,当节点键值小于给定范围的下界 low 时,遍历右子树;当节点键值大于给定范围的上界 high 时,遍历左子树;否则,将当前节点的键值加入结果中,并同时遍历左右子树。

queue 队列表示 BFS 中待遍历的节点队列。具体实现中,当节点键值小于给定范围的下界 low 时,将右子节点加入队列;当节点键值大于给定范围的上界 high 时,将左子节点加入队列;否则,将当前节点的键值加入结果中,并同时将左右子节点加入队列。

总结

本文介绍了如何计算 BST 中位于给定范围内的节点数量。具体实现中,可以采用 DFS 或 BFS,并通过遍历统计符合条件的节点数量来完成。

从时间复杂度上看,DFS 和 BFS 的时间复杂度均为 O(n),其中 n 是 BST 中的节点个数。但是,DFS 的空间复杂度为 O(log n),因为 DFS 遍历过程中需要维护一个栈;而 BFS 的空间复杂度为 O(n),因为 BFS 遍历过程中需要维护一个队列。因此,在空间复杂度有限制的情况下,应该优先选择 DFS。