938. 二叉搜索树的范围和
难度:简单
语言:java
题目内容
给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和。
解题思路
树的题目无外乎两种解决方法递归与迭代。
递归的方法就是深度优先搜索(dfs)
答案也有方法,但是我更倾向于这种,使用中序遍历来过一遍整个树的内容,见上一篇文章中有各种遍历算法的格式,几乎只需要背掉就可以解决问题了。
class Solution {
int ans;
public int rangeSumBST(TreeNode root, int low, int high) {
dfs(root,low,high);
return ans;
}
void dfs(TreeNode root,int low, int high){
if (root == null) return;
dfs(root.left,low,high);
if (low<=root.val && root.val <= high){
ans += root.val;
}
dfs(root.right,low,high);
}
}
迭代的方法就是宽度优先搜索(bfs),用栈的原理,通过压栈出栈从而达到跟dfs相似的结果。其实迭代也有类似的公式法则,在树的简单题中,很难理解记住公式即可。
class Solution {
public int rangeSumBST(TreeNode root, int low, int high) {
int ans = 0;
Deque<TreeNode> d = new ArrayDeque<>();
while (root != null || !d.isEmpty()) {
while (root != null) {
d.addLast(root);
root = root.left;
}
root = d.pollLast();
if (low <= root.val && root.val <= high) {
ans += root.val;
}
root = root.right;
}
return ans;
}
}