• [LeetCode] 938. 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 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

    二叉搜索树的范围和。题意是给一个二叉搜索树和一个范围(L, R),请输出二叉搜索树里面所有node值介于L和R之间的node值的加和(sum)。两种做法,迭代和递归。时间和空间复杂度都是O(n)。

    迭代 - 中序遍历。注意:对BST做中序遍历的结果是有序的。

    JavaScript实现

     1 /**
     2  * @param {TreeNode} root
     3  * @param {number} L
     4  * @param {number} R
     5  * @return {number}
     6  */
     7 var rangeSumBST = function (root, L, R) {
     8     var arr = [],
     9         sum = 0;
    10     inorder(root, arr);
    11     for (var i = 0; i < arr.length; i++) {
    12         if (arr[i] >= L && arr[i] <= R) {
    13             sum = sum + arr[i];
    14         }
    15     }
    16     return sum;
    17 };
    18 
    19 var inorder = function (root, arr) {
    20     if (root == null) {
    21         return;
    22     }
    23     inorder(root.left, arr);
    24     arr.push(root.val);
    25     inorder(root.right, arr);
    26     return;
    27 };

    Java实现 - stack

    首先说一下,正常的层序遍历是可以做的,但是我这里介绍一个更快的方法。这其实是一个隐式的层序遍历。先把根节点放入stack,pop出来的时候,如果cur.val在范围内就叠加到sum中;同时判断cur.val是否 >= L,如果是则加入cur.left,因为有可能比cur小的元素也在L - R这个范围内;再判断cur.val是否<= R,如果是则加入cur.right,因为有可能比cur大的元素也在范围内。

     1 class Solution {
     2     public int rangeSumBST(TreeNode root, int L, int R) {
     3         Stack<TreeNode> stack = new Stack<>();
     4         stack.push(root);
     5         int sum = 0;
     6         while (!stack.isEmpty()) {
     7             TreeNode cur = stack.pop();
     8             if (cur == null) {
     9                 continue;
    10             }
    11             if (cur.val >= L && cur.val <= R) {
    12                 sum += cur.val;
    13             }
    14             if (cur.val > L) {
    15                 stack.push(cur.left);
    16             }
    17             if (cur.val < R) {
    18                 stack.push(cur.right);
    19             }
    20         }
    21         return sum;
    22     }
    23 }

    递归

    递归的思路是如果当前节点 > R则递归处理当前节点的左子树;如果当前节点 < L则递归处理当前节点的右子树。

    JavaScript实现

     1 /**
     2  * @param {TreeNode} root
     3  * @param {number} L
     4  * @param {number} R
     5  * @return {number}
     6  */
     7 var rangeSumBST = function (root, L, R) {
     8     // corner case
     9     if (root === null) {
    10         return 0;
    11     }
    12 
    13     // normal case
    14     if (root.val > R) {
    15         return rangeSumBST(root.left, L, R);
    16     } else if (root.val < L) {
    17         return rangeSumBST(root.right, L, R);
    18     } else {
    19         return root.val + rangeSumBST(root.left, L, R) + rangeSumBST(root.right, L, R);
    20     }
    21 };

    Java实现

     1 class Solution {
     2     public int rangeSumBST(TreeNode root, int L, int R) {
     3         // corner case
     4         if (root == null) {
     5             return 0;
     6         }
     7 
     8         // normal case
     9         if (root.val > R) {
    10             return rangeSumBST(root.left, L, R);
    11         }
    12         if (root.val < L) {
    13             return rangeSumBST(root.right, L, R);
    14         }
    15         return root.val + rangeSumBST(root.left, L, R) + rangeSumBST(root.right, L, R);
    16     }
    17 }

    LeetCode 题目总结

  • 相关阅读:
    20201220第二周学习总结
    师生关系
    快速浏览教材
    学期2020-2021-1学号20201220《信息安全专业导论》第1周学习总结
    编程将字符串s倒序输出,要求利用函数递归实现
    小学生四则运算随机生成程序
    礼炮问题
    C语言最大公约数
    C语言判断三角形类型
    C语言:一元二次方程解的所有情况
  • 原文地址:https://www.cnblogs.com/cnoodle/p/12242037.html
Copyright © 2020-2023  润新知