LeetCode938:二叉搜索树的范围和

思路一:中序遍历后遍历求和

只要是关于二叉搜索树的问题,首先要想到二叉搜索树的特征以及中序遍历的特征。此题中的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;	
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值