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 }