二叉搜索树的范围和
难度:
标签:
题目描述
给定二叉搜索树的根结点 root
,返回值位于范围 [low, high]
之间的所有结点的值的和。
示例 1:

输入:root = [10,5,15,3,7,null,18], low = 7, high = 15 输出:32
示例 2:

输入:root = [10,5,15,3,7,13,18,1,null,6], low = 6, high = 10 输出:23
提示:
- 树中节点数目在范围
[1, 2 * 104]
内 1 <= Node.val <= 105
1 <= low <= high <= 105
- 所有
Node.val
互不相同
代码结果
运行时间: 180 ms, 内存: 23.6 MB
/*
* 思路:
* 使用Java Stream API和递归进行DFS遍历二叉搜索树,对于每个节点,判断其值是否在给定范围内,
* 如果在范围内则累加到总和,否则根据其值与范围的比较决定是否继续遍历左子树或右子树。
*/
import java.util.stream.Stream;
public class Solution {
public int rangeSumBST(TreeNode root, int low, int high) {
// 使用stream进行DFS并计算总和
return dfs(root, low, high).mapToInt(Integer::intValue).sum();
}
private Stream<Integer> dfs(TreeNode node, int low, int high) {
if (node == null) {
return Stream.empty();
}
Stream<Integer> current = Stream.empty();
if (node.val >= low && node.val <= high) {
current = Stream.of(node.val);
}
Stream<Integer> left = dfs(node.left, low, high);
Stream<Integer> right = dfs(node.right, low, high);
return Stream.concat(current, Stream.concat(left, right));
}
}
解释
方法:
此题解采用递归方法解决二叉搜索树中的范围求和问题。首先,检查当前节点是否为空,若为空,则返回和为0。其次,根据二叉搜索树的性质,如果当前节点的值小于下限low,则只需递归右子树;如果当前节点的值大于上限high,则只需递归左子树。如果当前节点的值在[low, high]范围内,则将其值加到总和中,并继续递归左右子树。这种方法有效利用了二叉搜索树的性质,减少了不必要的节点访问。
时间复杂度:
O(n)
空间复杂度:
O(h)
代码细节讲解
🦆
题解中提到,如果当前节点的值小于下限low,则只递归右子树。为什么不需要同时检查左子树?
▷🦆
在递归过程中,如果当前节点值位于[low, high]范围内,递归两个子树是否有可能导致重复计算节点值的问题?
▷🦆
题解未提及处理节点值正好等于low或high的情况,这种情况下的逻辑处理与描述中的其他情况有何不同?
▷🦆
如何修改题解中的算法,以优化对于特定范围(low和high非常接近时)的查询效率?
▷