我们遍历二叉树的每一个节点,判断他的值是否在[low, high]之间,如果在这个之间, 我们就统计他们的和。

    1. class Solution {
    2. int sum = 0;
    3. public int rangeSumBST(TreeNode root, int low, int high) {
    4. recur(root, low, high);
    5. return sum;
    6. }
    7. public void recur(TreeNode root, int low, int high) {
    8. if (root == null) return;
    9. if (root.val >= low && root.val <= high) {
    10. sum += root.val;
    11. }
    12. recur(root.left, low, high);
    13. recur(root.right, low, high);
    14. }
    15. }

    这题有个条件就是二搜索叉树,我们知道二叉搜索树的特点就是左子树的所有节点值都比 当前节点值小,右子树的所有节点值都比当前节点值大,如果我们按照中序遍历的方式打印的话,就会发现打印的结果是升序排列的。
    上面那种解法遍历每一个节点,虽然也能解决问题,但很效率不是最好的,对于二叉搜索树
    如果当前节点小于low,那么他它的左子树的所有节点肯定也都小于low,我们没必 要在遍历了,直接放弃
    如果当前节点大于high,那么他的右子树的所有节点肯定也都大于high,也可以放弃

    1. public int rangeSumBST(TreeNode root, int low, int high) {
    2. if (root == null) return 0;
    3. //当前节点以及他的右子树的值都太大了,不要了
    4. if (root.val > high) {
    5. return rangeSumBST(root.left, low, high);
    6. }
    7. //当前节点以及他的左子树的值都太小了,也不要了
    8. if (root.val < low) {
    9. return rangeSumBST(root.right, low, high);
    10. }
    11. //如果当前节点值在[low, high]之间,就留下
    12. return root.val + rangeSumBST(root.left, low, high) + rangeSumBST(root.right, low, high);
    13. }