版权声明:本文为博主原创文章,转载请注明出处! https://blog.csdn.net/ASN_forever/article/details/85218110
思路一:中序遍历后遍历求和
只要是关于二叉搜索树的问题,首先要想到二叉搜索树的特征以及中序遍历的特征。此题中的L和R指的是中序遍历排序后的前后两个结点。因此,要求L和R之间所有结点的值的和,就可以先中序遍历得到排序后的数组,然后遍历数组求和即可。
public int rangeSumBST(TreeNode root, int L, int R) {
ArrayList<Integer> list = new ArrayList<Integer>();
help(root,list);
Object[] arr = list.toArray();
int res = 0;
for(int i=0;i<arr.length;i++){
if((Integer)arr[i] >= L && (Integer)arr[i] <= R){
res += (Integer)arr[i];
}
}
return res;
}
public void help(TreeNode root,ArrayList<Integer> list){
if(root == null){
return;
}
help(root.left,list);
list.add(root.val);
help(root.right,list);
}
思路二:遍历二叉树时同时求和
思路一做了一些无用功,就是先完全遍历一遍整个二叉树,然后再遍历数组。其实可以考虑在遍历二叉树的同时判断结点的值是否在L和R之间,是的话就求和,超出范围就结束遍历。这样就大大降低时间复杂度了。
public int rangeSumBST(TreeNode root, int L, int R) {
if(root == null){
return 0;
}
if(root.val < L){
return rangeSumBST(root.right, L, R);
}
if(root.val > R){
return rangeSumBST(root.left, L, R);
}
int res = 0;
if(root.val >= L && root.val <= R){
int left = rangeSumBST(root.left, L, R);
res += root.val;
int right= rangeSumBST(root.right, L, R);
res += (left + right);
}
return res;
}