371 字
2 分钟
算法之二叉搜素树范围和

938. 二叉搜索树的范围和#

给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和。

image-20210619160458047

解法

1.递归深度优先搜索

按深度优先搜索的顺序计算范围和。记当前子树根节点为 root, 分4种情况讨论

  1. root节点为空,返回0
  2. root.val值大于high的值,根据二叉搜索树的性质知道,应该此时去找root的左子树,无需考虑右子树
  3. root.val值小于low的值,根据二叉搜索树的性质知道,应该此时去找root的右子树,无需考虑左子树
  4. root.val值必须在[low, high]范围内

最终应该返回这个节点值和左右子树值的和

var rangeSumBST = function(root, low, high) {
if (!root) {
return 0;
}
if (root.val > high) {
return rangeSumBST(root.left, low, high);
}
if (root.val < low) {
return rangeSumBST(root.right, low, high);
}
return root.val + rangeSumBST(root.left, low, high) + rangeSumBST(root.right, low, high);
};

2.迭代(广度优先)

使用广度优先搜索的方法,用一个队列 q 存储需要计算的节点。每次取出队首节点时,若节点为空则跳过该节点,否则按方法一中给出的大小关系来决定加入队列的子节点。

var rangeSumBST = function(root, low, high) {
let sum = 0;
const q = [root];
while (q.length) {
const node = q.shift();
if (!node) {
continue;
}
if (node.val > high) {
q.push(node.left);
} else if (node.val < low) {
q.push(node.right);
} else {
sum += node.val;
q.push(node.left);
q.push(node.right);
}
}
return sum;
};
算法之二叉搜素树范围和
https://nollieleo.github.io/posts/算法之二叉搜素树范围和/
作者
翁先森
发布于
2021-06-19
许可协议
CC BY-NC-SA 4.0