LeetCode 96. Unique Binary Search Trees 1&2

Given n, how many structurally unique BST’s (binary search trees) that store values 1…n?

For example,
Given n = 3, there are a total of 5 unique BST’s.
題目鏈接

  • 題目描述
    給定n個不同元素,求可以構成多少種BST?
  • 思路
    這一次又領略到了遞歸的牛逼。對一個根節點來說,它及其子樹能構成BST的種數等於左子樹BST數目乘右子樹BST數目。循環根節點,求和即可。
public int numTrees1( int n ) {
        if ( n==0 ) 
            return 1; 
        int sum = 0; 
        for ( int i=1; i<=n; i++ ) {
            sum += numTrees(i-1) * numTrees(n-i);
        }
        return sum; 
}

再使用數組記錄一下…

int[] dp = new int[100];
    public int numTrees( int n ) {
        if ( dp[n]!=0 )
            return dp[n];
        int sum = 0; 
        if ( n!=0 ) {
            for ( int i=1; i<=n; i++ ) {
                sum += numTrees(i-1) * numTrees(n-i);
            }
        } else {
            sum = 1; 
        }
        return dp[n] = sum ;
    }

可以直接寫成動態規劃形式

public int numTrees(int n) {
        int[] dp = new int[n+1]; 
        dp[0] = dp[1] = 1; 
        for ( int i=2; i<=n; i++ ) {
            for ( int j=0; j<i; j++ ) {
                dp[i] += dp[j] * dp[n-1-j]; 
            }
        }
        return dp[n]; 
    }

至於怎麼構成,直接上代碼了。。。


class UniqueBanirySearch2 {
    public ArrayList<TreeNode> generateTrees(int n) {
        if ( n<=0 ) 
            return new ArrayList<>(); 
        else {
            return generateSubtree(1,n); 
        }
    }
    public ArrayList<TreeNode> generateSubtree(int start,int end) {
        ArrayList<TreeNode> result = new ArrayList<>(); 
        if ( start>end ) {
            result.add(null);
        } else {
            for ( int value = start; value<=end; value++ ) {
                for ( TreeNode left : generateSubtree(start, value-1) ) {
                    for ( TreeNode right: generateSubtree(value+1, end) ) {
                        TreeNode root = new TreeNode(value);
                        root.left = left; 
                        root.right = right;
                        result.add(root);
                    }       
                }
            }
        }
        return result; 
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章