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