题目描述

给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和。

二叉搜索树保证具有唯一的值。

样例一:

输入:root = [10,5,15,3,7,null,18], L = 7, R = 15
输出:32

样例二:

输入:root = [10,5,15,3,7,13,18,1,null,6], L = 6, R = 10
输出:23

题目分析:

从上面的样例看,输入的时候输入了一颗树,同时也输入了L和R的值,就相当于给你一个区间, 然后看看这棵树里面凡是在这个区间内的所有节点的值,加起来的总和是多少?

然后要做这道题,首先我们要明白二叉搜索树的特征


二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。


代码实现

对于树的遍历,一般十有八九都是递归,然后递归的话,肯定要分左子树和右子树分别递归。

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int rangeSumBST(TreeNode* root, int L, int R) {
//根
if(!root) return 0;
//当前节点的val值比L还小,则左子树不必再遍历了,遍历右子树即可
if(root->val<L){
return rangeSumBST(root->right,L,R);
}
//右 如果当前节点的值比R还大,那该节点的右子树也不必在遍历了
else if(root->val>R){
return rangeSumBST(root->left,L,R);
}
//
else
return rangeSumBST(root->left,L,R)+rangeSumBST(root->right,L,R)+root->val;
}
};