LeetCode938:二叉搜索树的范围和

版权声明:本文为博主原创文章,转载请注明出处! 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;	
    }

猜你喜欢

转载自blog.csdn.net/ASN_forever/article/details/85218110