版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuzhixiong_521/article/details/85014372
题目链接
Problem.938:https://leetcode.com/problems/range-sum-of-bst/
题目描述
给定一个二叉搜索树的根节点,以及两个整数类型的左边界和右边界,计算二叉搜索树中介于左边界和右边界的整数和(包含左边界和右边界)。注:假设二叉搜索树中的节点值唯一。
示例
输入1:
root = [10,5,15,3,7,null,18], L = 7, R = 15
输出1:
32
输入2:
root = root = [10,5,15,3,7,13,18,1,null,6], L = 6, R = 10
输出2:
23
解析
首先定义一个全局变量sum用于记录求和结果。
既然是二叉搜索树,必然要分类讨论,只不过这个题目不是分两步讨论,而是分五步讨论。讨论如下:
- 首先对根节点判空。
- 若根节点值小于左边界L,则递归遍历根节点的右子树,L和R不变。
- 若根节点值等于左边界L,则sum加上L,递归遍历右子树,左边界L变为L+1,右边界R不变。
- 若根节点值大于左边界L且小于右边界R,则首先sum加上根节点值root.val,然后分两步递归,一为遍历左子树,L不变,R为root.val-1,二为遍历右子树,L变为root.val+1,R不变。
- 若根节点值等于右边界R,则sum加上R,然后递归遍历左子树,L不变,R变为root.val-1。
- 若根节点值大于右边界R,则递归遍历根节点的左子树,L和R不变。
代码
int sum = 0;
public int rangeSumBST(TreeNode root, int L, int R) {
if(root != null){
int val = root.val;
if(val < L){
rangeSumBST(root.right, L, R);
} else if(val == L){
sum += L;
rangeSumBST(root.right, L+1, R);
} else if(L < val && val < R){
sum += val;
rangeSumBST(root.left, L, val-1);
rangeSumBST(root.right, val+1, R);
} else if(val == R){
sum += R;
rangeSumBST(root.left, L, R-1);
} else if(val > R){
rangeSumBST(root.left, L, R);
}
}
return sum;
}