938. 二叉搜索树的范围和
给定二叉搜索树的根结点 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 * 10^4]
内 1 <= Node.val <= 10^5
1 <= low <= high <= 10^5
- 所有
Node.val
互不相同
方法一:中序遍历
可以采用「中序遍历」来遍历二叉树所有节点,找出在 val
在 [low,high]
区间内的节点累加。
参考代码
public int rangeSumBST(TreeNode root, int low, int high) {
int ret = 0;
Deque<TreeNode> stack = new LinkedList<>();
while (!stack.isEmpty() || root != null) {
while (root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
if (root.val >= low && root.val <= high) {
ret += root.val;
}
root = root.right;
}
return ret;
}
执行结果
方法二:深度优先搜索(DFS)
方法一的执行结果并不理想,原因在于我们并没有使用到「二叉搜索树」的特性,而是当成一颗普通二叉树在处理。
对于当前节点 root
:
- 当
root.val < low
,没有必要去搜索 root.left,因为左边的节点都小于 root。 - 同理 当
root.val > high
,没有必要去搜索 root.right,因为右边的节点都大于 root。 - 只有当
low <= roo.val <= high
时,需要两边都搜索。
参考代码
public int rangeSumBST(TreeNode root, int low, int high) {
if (root == null) {
return 0;
}
if (root.val < low) {
return rangeSumBST(root.right, low, high);
} else if (root.val > high) {
return rangeSumBST(root.left, low, high);
}
return root.val + rangeSumBST(root.left, low, high) + rangeSumBST(root.right, low, high);
}
执行结果