- Range Sum of BST
Given the root node of a binary search tree, return the sum of values of all nodes with value between L and R (inclusive).
The binary search tree is guaranteed to have unique values.
Example
Example 1:
Input: root = [10,5,15,3,7,null,18], L = 7, R = 15
Output: 32
Example 2:
Input: root = [10,5,15,3,7,13,18,1,null,6], L = 6, R = 10
Output: 23
Notice
The number of nodes in the tree is at most 10000.
The final answer is guaranteed to be less than 2^31.
解法1:DFS+剪枝。遍历。
注意:
- 当 root->val < L || root->val > R时,仍然有可能DFS。
只是 当 root->val < L时,不必进行root->left的DFS,当root->val > R时,不必进行root->right的DFS。
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: the root node
* @param L: an integer
* @param R: an integer
* @return: the sum
*/
int rangeSumBST(TreeNode * root, int L, int R) {
int sum = 0;
helper(root, L, R, sum);
return sum;
}
private:
void helper(TreeNode * root, int L, int R, int & sum) {
if (!root) return;
if (root->val >= L && root->val <= R) sum += root->val;
if (root->val > L) helper(root->left, L, R, sum);
if (root->val < R) helper(root->right, L, R, sum);
}
};
代码同步在
https://github.com/luqian2017/Algorithm
二刷:还是遍历。
class Solution {
public:
/**
* @param root: the root node
* @param L: an integer
* @param R: an integer
* @return: the sum
*/
int rangeSumBST(TreeNode * root, int L, int R) {
helper(root, L, R);
return sum;
}
private:
int sum = 0;
void helper(TreeNode *root, int L, int R) {
if (!root) return;
if (root->val < L) {
helper(root->right, L, R);
} else if (root->val > R) {
helper(root->left, L, R);
} else {
sum += root->val;
helper(root->left, L, R);
helper(root->right, L, R);
}
}
};
解法3:分治
class Solution {
public:
/**
* @param root: the root node
* @param L: an integer
* @param R: an integer
* @return: the sum
*/
int rangeSumBST(TreeNode * root, int L, int R) {
if (!root) return 0;
if (root->val < L) {
return rangeSumBST(root->right, L, R);
} else if (root->val > R) {
return rangeSumBST(root->left, L, R);
} else {
return root->val + rangeSumBST(root->left, L, R) + rangeSumBST(root->right, L, R);
}
}
};