📅  最后修改于: 2023-12-03 15:12:01.525000             🧑  作者: Mango
二叉搜索树(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。