返回
LeetCode 938. 二叉搜索树的范围和:高阶技巧轻松掌握
前端
2023-11-11 14:01:11
LeetCode 938题概述
问题
给你一棵二叉搜索树的根节点root和两个整数low和high。你需要返回树中所有值的和,值在low和high之间(包括low和high)。
示例 1:
输入:root = [10,5,15,3,7,null,18], low = 7, high = 15
输出:32
示例 2:
输入:root = [10,5,15,3,7,13,18,1,null,6], low = 6, high = 10
输出:23
提示:
- 树中节点的数目在[1, 2 * 10^4]范围内。
- 1 <= Node.val <= 10^5
- 1 <= low <= high <= 10^5
解决思路
对于这道题目,我们可以使用中序遍历二叉搜索树,并将每个节点的值与low和high进行比较。如果节点的值在[low, high]之间,则将其计入总和中。
中序遍历二叉搜索树的算法如下:
function inorderTraversal(root, low, high, sum) {
if (root == null) {
return sum;
}
sum = inorderTraversal(root.left, low, high, sum);
if (root.val >= low && root.val <= high) {
sum += root.val;
}
sum = inorderTraversal(root.right, low, high, sum);
return sum;
}
这个算法的时间复杂度为O(n),其中n是二叉搜索树中的节点数。
详细注释
/*
* @param {TreeNode} root 二叉搜索树的根节点
* @param {number} low 范围的最小值
* @param {number} high 范围的最大值
* @return {number} 二叉搜索树中所有值在[low, high]范围内的和
*/
const rangeSumBST = (root, low, high) => {
// 创建一个变量sum来存储结果
let sum = 0;
// 调用中序遍历算法来遍历二叉搜索树
sum = inorderTraversal(root, low, high, sum);
// 返回sum
return sum;
};
/*
* @param {TreeNode} root 二叉搜索树的根节点
* @param {number} low 范围的最小值
* @param {number} high 范围的最大值
* @param {number} sum 当前的和
* @return {number} 二叉搜索树中所有值在[low, high]范围内的和
*/
const inorderTraversal = (root, low, high, sum) => {
// 如果根节点为空,则返回sum
if (root == null) {
return sum;
}
// 递归遍历左子树
sum = inorderTraversal(root.left, low, high, sum);
// 如果根节点的值在[low, high]范围内,则将根节点的值添加到sum中
if (root.val >= low && root.val <= high) {
sum += root.val;
}
// 递归遍历右子树
sum = inorderTraversal(root.right, low, high, sum);
// 返回sum
return sum;
};
代码示例
// 示例1
const root1 = {
val: 10,
left: {
val: 5,
left: {
val: 3,
left: null,
right: null
},
right: {
val: 7,
left: null,
right: null
}
},
right: {
val: 15,
left: null,
right: {
val: 18,
left: null,
right: null
}
}
};
const low1 = 7;
const high1 = 15;
console.log(rangeSumBST(root1, low1, high1)); // 输出:32
// 示例2
const root2 = {
val: 10,
left: {
val: 5,
left: {
val: 1,
left: null,
right: null
},
right: {
val: 6,
left: null,
right: null
}
},
right: {
val: 15,
left: {
val: 13,
left: null,
right: null
},
right: {
val: 18,
left: null,
right: null
}
}
};
const low2 = 6;
const high2 = 10;
console.log(rangeSumBST(root2, low2, high2)); // 输出:23