2024.2.26
题目来源
我的题解
方法一 深度搜索(中序遍历)
利用二叉搜索树中序遍历是升序的特点,在中序遍历过程中进行截断。若当前节点小于等于最小值,则不可能再访问左子树;若当前节点大于等于最大值,则不可能再访问右子树。然后判断遍历的当前节点值是否在有效范围内。
时间复杂度:O(n)
空间复杂度:O(n)
int sum=0;
public int rangeSumBST(TreeNode root, int low, int high) {
inOrder(root,low,high);
return sum;
}
public void inOrder(TreeNode root,int low,int high){
if(root==null)
return ;
//若当前节点小于等于最小值,则不可能再访问左子树
if(root.val>low)
inOrder(root.left,low,high);
if(root.val>=low&&root.val<=high)
sum+=root.val;
//若当前节点大于等于最大值,则不可能再访问右子树
if(root.val<high)
inOrder(root.right,low,high);
}
方法二 广度搜索(层序遍历)
换成层序遍历。
时间复杂度:O(n)
空间复杂度:O(n)
public int rangeSumBST(TreeNode root, int low, int high) {
int sum=0;
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int sz=queue.size();
for(int i=0;i<sz;i++){
TreeNode t=queue.poll();
if(t.val>=low&&t.val<=high)
sum+=t.val;
//若当前节点小于等于最小值,则不可能再访问左子树
if(t.val>low&&t.left!=null)
queue.offer(t.left);
//若当前节点大于等于最大值,则不可能再访问右子树
if(t.val<high&&t.right!=null)
queue.offer(t.right);
}
}
return sum;
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~