给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
示例:
输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
解题思路:
跟LeetCode-95.不同的二叉搜索树(https://blog.csdn.net/weixin_38823568/article/details/82872770)同样的思路
辅助数组int[] cnt,cnt[i]表示以1 ... i+1为节点组成的二叉搜索树的种数([i~j]表示以i ... j为节点组成的二叉搜索树)
n = 1, cnt[0] = 1
可能的二叉搜索树结构:{null 1 null}
n = 2, cnt[1] = 2 = 2*cnt[0]
可能的二叉搜索树结构:{null 1 [2]}、{[1] 2 null}
n = 3, cnt[2] = 5 = 2*cnt[1] + cnt[0]*cnt[0]
可能的二叉搜索树结构:{null 1 [2~3]}、{[1] 2 [3]}、{[1~2] 3 null}
n = 4, cnt[3] = 14 = 2*cnt[2] + 2cnt[0]*cnt[1]
可能的二叉搜索树结构:{null 1 [2~4]}、{[1] 2 [3~4]}、{[1~2] 3 [4]}、{[1~3] 4 null}
...
以此类推
Java代码:
class Solution {
public int numTrees(int n) {
if(0 == n)
return 0;
int[] cnt = new int[n];
if(0 < n){
cnt[0] = 1;
}
if(1 < n){
cnt[1] = 2;
}
for(int i = 2; i < n; i++){
int p = i/2, q = i%2;
cnt[i] += 2*cnt[i-1];
int s = 0;
while(s < (p - 1 + q)){
cnt[i] += 2*cnt[s]*cnt[i-2-s];
s++;
}
if(0 == q){
cnt[i] += cnt[p-1]*cnt[p-1];
}
}
return cnt[n-1];
}
}