938. 二叉搜索树的范围和
一、题目
1.题目描述
给定二叉搜索树的根结点 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
互不相同
2.基础框架
C++基础框架代码如下:
int rangeSumBST(TreeNode* root, int low, int high) {
}
3.解题思路
- 题目分析
-
题目目标返回二叉搜索树中值在
[low, high]
的和。 -
二叉搜索树的特点是,左孩子节点的值比父结点小,右孩子结点值比父结点大。
-
可能存在的情况:
- ①范围在父节点的左侧,总体比父节点小,即
parent > high
,父节点往左孩子遍历 - ②范围在父节点的右侧,总体比父节点大,即
parent < low
,父节点往右孩子遍历 - ③范围在父节点的左右侧,
low
值比父节点小,high
值比父节点大,即low < parent < high
。左右孩子都遍历。
- ①范围在父节点的左侧,总体比父节点小,即
-
返回的和
sum
应从范围内开始计算。 -
当遇到不满足的情况,即该结点的值不满足
[low, high]
的范围:① 左右孩子也不在
[low,high]
范围中,或者该结点为空的时候,返回0。② 其中有一个孩子存在
[low, high]
范围中,则一直递归孩子方向,直到遇到①的情况,返回0。
- 实现代码:
int rangeSumBST(TreeNode* root, int low, int high) {
if (root == nullptr) return 0;
if (root->val < low)
return rangeSumBST(root->right, low, high);
else if (root->val > high)
return rangeSumBST(root->left, low, high);
else
return rangeSumBST(root->left, low, high) + rangeSumBST(root->right, low, high) + root->val;