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

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

二叉搜索树 (BST) 中给定范围内所有节点的中值

在二叉搜索树中,每个节点的值大于它的左子树中的所有节点的值,而小于它的右子树中的所有节点的值。这种特性使得二叉搜索树非常适合进行范围查询,可以找到某个范围内所有的节点。

问题描述: 给定一个二叉搜索树以及一个范围(最小值和最大值),找到所有在这个范围内的节点,并计算它们的中值。

例如,给定以下二叉搜索树以及范围为[3, 7]:

      4
    /   \
   2     6
  / \   / \
 1   3 5   7

我们可以找到以下所有节点:[3, 4, 5, 6, 7]。它们的中值是 5。

解题思路

一种可行的解决方案是使用递归。对于每个节点,如果节点的值小于最小值,则递归到右子树;如果节点的值大于最大值,则递归到左子树。如果节点的值在范围内,则将它的值添加到一个列表中,同时递归到左右子树。

代码如下:

def range_sum_bst(root, low, high):
    def dfs(node):
        nonlocal res
        if not node:
            return 
        if low <= node.val <= high:
            res.append(node.val)
        if node.val > low:
            dfs(node.left)
        if node.val < high:
            dfs(node.right)
    
    res = []
    dfs(root)
    return sum(res) / len(res)

这段代码中,我们定义了一个内部辅助函数 dfs 来遍历所有在范围内的节点,并将它们的值添加到 res 列表中。最后我们通过求列表和的方式计算这些节点的中值。

时间复杂度

对于一棵有n个节点的二叉搜索树,我们最坏情况下需要访问每个节点。因此时间复杂度为O(n)。

空间复杂度

递归函数需要调用栈来存储函数上下文,因此最坏情况下递归栈的深度为O(n),因此空间复杂度为O(n)。

总结

在本题中,我们依靠二叉搜索树的特性来快速定位需要的节点,并使用递归来实现遍历。这是一种较为简单的解决方案,但也有一些优化的空间。例如,我们可以使用迭代的方式实现深度优先遍历,或者使用广度优先遍历得到所有的节点,然后在这些节点中选出需要的节点。