题目
给定二叉搜索树的根结点 root,返回值位于范围 [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
题解
方法一:深度优先搜索
思路: 递归
- 当前节点为 null 时返回 0
- 当前节点X > high 时则返回左子树之和
- 当前节点X < low 时则返回右子树之和
- 当前节点 X >= low 且 X <= high 时则返回:当前节点值 + 左子树之和 + 右子树之和
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int rangeSumBST(TreeNode root, int low, int high) {
if(root==null){
return 0;
}
if(root.val>high){
return rangeSumBST(root.left,low,high);
}else if(root.val<low){
return rangeSumBST(root.right,low,high);
}else{
return root.val+rangeSumBST(root.right,low,high)+rangeSumBST(root.left,low,high);
}
}
}
参考:https://leetcode-cn.com/problems/range-sum-of-bst/solution/hua-jie-suan-fa-938-er-cha-sou-suo-shu-de-fan-wei-/
复杂度分析
-
时间复杂度:O(n),其中 n 是二叉搜索树的节点数。
-
空间复杂度:O(n)。空间复杂度主要取决于栈空间的开销。
方法二:广度优先遍历(层序遍历)
思路: 队列
- 一个队列 qqq 存储需要计算的节点
- 每次取出队首节点时
- 节点为空则跳过该节点
- 否则按方法一中给出的大小关系来决定加入队列的子节点
class Solution {
public int rangeSumBST(TreeNode root, int low, int high) {
int sum = 0;
Queue<TreeNode> q = new LinkedList<TreeNode>();
q.offer(root);
while (!q.isEmpty()) {
TreeNode node = q.poll();
if (node == null) {
continue;
}
if (node.val > high) {
q.offer(node.left);
} else if (node.val < low) {
q.offer(node.right);
} else {
sum += node.val;
q.offer(node.left);
q.offer(node.right);
}
}
return sum;
}
}
复杂度分析
-
时间复杂度:O(n),其中n 是二叉搜索树的节点数。
-
空间复杂度:O(n)。空间复杂度主要取决于队列的空间。