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