题目
给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?
示例:
输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:
思路
- 二叉搜索树以I为根,左边的小于i,右边的大于i,同时有N个数,则一共可以有N个根,即
f(n) = t(1) + t(2) + t(3) + t(4) + ..+t(i)...+ t(n)
- 以i为根时,左边有i-1个数,右边有N-i个数,则,他的右边有f(i-1)个二叉搜索树数,右边有f(N-i)个二叉搜索树数,左右二叉树排序互不相关,所以每改变左右任意一个数,则总的二叉树结构就改变一次。所以
t(i) = f(i-1) * f(n-i)
1、当n = 1 时
f(1) = t(1) = 1
2、当n = 2时
f(2) = t(1) + t(2) = 2
t(1) = f(0) * f(1) = 1
t(2) = f(1) * f(0) =1
3、当n = 3时
f(3) = t(1) + t(2) + t(3) = 5
t(1) = f(0) * f(2) = 2
t(2) = f(1) * f(1) = 1
t(3) = f(2) * (0) = 2
以此类推
- 所以总的公式为:
f(n) = f(0) * f(n-1) + f(1) * f(n-2) + .... + f(i-1) * f(n-i) ...+ f(n-1) * f(0)
代码:
class Unique_Binary_Search_Trees_96 {
public int numTrees(int n) {
if (n<=1){
return 1;
}
int[] dp = new int[n + 1];
dp[0] = 1;
dp[1] = 1;
//dp[i] i个节点有多少个二叉搜索树
for (int i = 2; i <= n ;i++){
//J表示以J为根节点,左右节点数为 j-1、i-j,根节点取1~i
for (int j = 1 ; j <= i; j++){
dp[i] += dp[j-1] * dp[i-j];
}
}
return dp[n];
}
}