一、题意
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
二、解法
解法一:
动态规划
二叉搜索树,种数由其左右子树决定,种数=左子树种数*右子树种数,因为左右子树的上元素个数有多种情况,所以
G
(
i
)
=
∑
j
=
1
i
G
(
i
−
j
)
∗
G
(
j
−
1
)
G(i)=\sum^i_{j=1}G(i-j)*G(j-1)
G(i)=∑j=1iG(i−j)∗G(j−1)。
时间复杂度:
O
(
n
2
)
O(n^2)
O(n2)
空间复杂度:
O
(
n
)
O(n)
O(n)
解法二:
卡特兰数
G
0
=
0
,
G
n
+
1
=
2
(
2
n
+
1
)
n
+
2
C
n
G_0=0,G_{n+1}=\frac{2(2n+1)}{n+2}C_n
G0=0,Gn+1=n+22(2n+1)Cn
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)
三、代码
解法:
int numTrees(int n) {
vector<int> f(n+1,0);
f[0]=f[1]=1;
for(int i=2;i<=n;i++){
for(int j=1;j<=i;j++){
f[i]+=f[i-j]*f[j-1];
}
}
return f[n];
}
四、总结
这一题原来做过,当时没写出来,直接用了卡特兰数,相当于没理解,这次做,只知道有规律但想直接推,推不出来。
五、引用
[1] leetcode:91. Decode Ways
[2] leetcode:91. Decode Ways官方解法