题目: 给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和。
二叉搜索树保证具有唯一的值。
示例:
思路分析:
一、按照题目所给为BST,首先想到的是按照遍历,将其所有结点全遍历进列表之中,然后上一个循环来将列表中的所有值循环一遍,写完之后,我发现这是个笨办法,因为提交了以后就超过时间限制了,所以就要想办法,精简程序。
二、依旧是遍历每个结点,在遍历中就将符合范围内的结点加入求和变量之中。
三、直接分大方向,当根节点值小于左范围时,直接进入右子树进行判断,可以节省在另左子树上浪费的时间,当根节点值大于右范围时,右子树的值比根节点还要大,所以直接返回左子树进行查找;如果根节点值正好处于左右两范围之间的话,那么对该值进行判断,然后继续判断其左右子树上的结点是否在范围之内。
Code ------ 二
class Soulution {
int sum = 0;
public int rangeSumBST(TreeNode root, int L, int R) {
helper(root, L, R);
return sum;
}
public void helper(TreeNode root, int L, int R) {
if (root == null) {
return;
}
if (root.val <= R && root.val >= L) {
sum += root.val;
}
helper(root.left, L, R);
helper(root.right, L, R);
}
}
时间复杂度分析:
1.时间复杂度:O(N):需将全树结点遍历一遍且仅一遍。
2.空间复杂度:O(N):递归调用辅助栈空间。
Code ------ 三
class Solution {
int sum = 0;
public int rangeSumBST(TreeNode root, int L, int R) {
helper(root, L, R);
return sum;
}
public void helper(TreeNode root, int L, int R) {
if (root == null) {
return;
}
if (root.val > R) {
helper(root.left, L, R);
}
if (root.val < L) {
helper(root.right, L, R);
}
if (root.val <= R && root.val >= L) {
sum += root.val;
}
}
}
时间复杂度分析:
1.时间复杂度:O(N)
2.空间复杂度:O(N)
ps:含义与上算法相同,但是O(N)只是对时间和空间上限的描述而不是确切的,故其包含的也是结点个数,但是实际运行起来,算法二肯定比算法一的时间要快,占用的空间要少。