📅  最后修改于: 2023-12-03 15:06:19.708000             🧑  作者: Mango
在二叉搜索树中,每个节点的值大于它的左子树中的所有节点的值,而小于它的右子树中的所有节点的值。这种特性使得二叉搜索树非常适合进行范围查询,可以找到某个范围内所有的节点。
问题描述: 给定一个二叉搜索树以及一个范围(最小值和最大值),找到所有在这个范围内的节点,并计算它们的中值。
例如,给定以下二叉搜索树以及范围为[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)。
在本题中,我们依靠二叉搜索树的特性来快速定位需要的节点,并使用递归来实现遍历。这是一种较为简单的解决方案,但也有一些优化的空间。例如,我们可以使用迭代的方式实现深度优先遍历,或者使用广度优先遍历得到所有的节点,然后在这些节点中选出需要的节点。