给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
示例:
输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
思路:
参考博客http://blog.sina.com.cn/s/blog_5ce680a40102vqgu.html 的思路
解释一下博客的思路:
如果只有1个节点,很容易得到只有1种情况(f(1)=1),2个节点,也很容易得到两只有2种情况(f(2)=2)
要是有3个,4个,甚至更多呢?
(1)对于3个节点(1,2,3)
我们任选1,2,3其中一个作为根节点,会出现三种情况:左2右0,左1右1,左0右2
扫描二维码关注公众号,回复:
3429345 查看本文章
即 f(2)f(0)+f(1)f(1)+f(0)(2),如下,共5种,所以f(3)=5;
①左2右0(2种):
3 3
/ /
2 1
/ \
1 2
②左1右1(1种):
2
/ \
1 3
③左0右2(2种):
1 1
\ \
2 3
\ /
3 2
(2)对于4个节点(1,2,3,4)
同上,出现如下情况:左3右0,左2右1,左1右2,左0右3
①左3右0 及 左0右3:
1 4
\ /
f(3) f(3)
上面我们知道了f(3)=5,所以左3右0为5种,同理左0右3也是5种
左3右0 + 左0右3 =10种
②左2右1及左1右2:
3 2
/ \ / \
f(2) 4 1 f(2)
f(2)=2,所以左2右1,左1右2各2种情况,加起来一共4种
所以f(4)=14
(3)归纳上面举例的情况,可以得到如下关系( f(0)=1 ):
f(n) = f(n-1)f(0) + f(n-2)f(1) + f(n-3)f(2) + ... + f(1)f(n-2) + f(n-1)f(0)
代码:
class Solution {
public int numTrees(int n) {
if(n==0){
return 0;
}
int[] nums = new int[n+1];
nums[0]=1; nums[1]=1;
if(n>1){
for (int i=2;i<=n;i++) {
for (int j=0;j<i;j++) {
nums[i] += nums[j]*nums[i-1-j];
}
}
}
return nums[n];
}
}