1. 程式人生 > >LeetCode938:二叉搜尋樹的範圍和

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;	
    }