📅  最后修改于: 2023-12-03 15:36:03.182000             🧑  作者: Mango
二叉搜索树(Binary Search Tree,简称 BST)是一种重要的数据结构,它具有以下性质:
二叉搜索树的这些性质使得在 BST 上进行查找操作非常高效。在某些场景下,我们需要在 BST 上查找具有给定范围值的节点,然后求出它们的节点总和。
给定一颗 BST 的根节点和两个整数 low
和 high
,求 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 中节点的个数。我们可以根据具体的场景选择其中一种方法进行实现。