二叉搜索树的范围和
这道题的我一开始的思路就是中序遍历取出所有数据,然后再挑选,但是这样的效率很低,而且代码量相对较多
既然题型是递归,当然需要使用到递归,基本思想是分为三个步骤:
1.如果root.val<L,那么符合条件的范围的值就是在root的右子树
2.如果root.val>R,那么符合条件的范围的值就是在root的左子树
3.如果L<=root.val<=R,那么符合条件的值就是在root的左子树和右子树
根据这个思路,很容易想到该如何进行递归,下面上代码
class Solution {
int sum=0;
public int rangeSumBST(TreeNode root, int L, int R) {
traversal(root,L,R);
return sum;
}
public void traversal(TreeNode root,int L,int R){
if(root==null){
return;
}
//情况一
if(root.val<L){
traversal(root.right,L,R);
}
//情况二
if(root.val>R){
traversal(root.left,L,R);
}
//情况三
if(root.val>=L&&root.val<=R){
sum+=root.val;
traversal(root.left,L,R);
traversal(root.right,L,R);
}
}
}
这种思路的好处就是利用二叉搜索树的特性,不需要遍历所有节点,虽然时间复杂度也是O(n),但是O(n)只是对时间或者空间上限的描述,不是那么确切,真正运行起来,尤其在数据量大的时候,就会节省大量的时间