卡塔兰数(又叫卡特兰数),那么这个与斐波那切数列齐名我们却很陌生的数列到底是什么?本期所用的树的数据结构均如下:
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
- 不同的二叉搜索树【中等题】
给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?
输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
题目详解
【解题思路】
这道题其实是一道找规律的题,n分别为 1,2,3 的情况如下所示。
这道题的规律在于,[1,n]这n个数都可以作为根结点,而当i成为根节点时,以i为根节点的二叉搜索树的个数就是[1,i-1]形成二叉搜索树的个数乘以[i+1,n]形成二叉搜索树的个数。具体做法如下:
- 把 n = 0 时赋为1,即dp[0]=1
- n = 1 时,只有一个根节点1,此时左边节点数=0,右边节点数=0, d p [ 1 ] = d p [ 0 ] ∗ d p [ 0 ] = 1 dp[1]=dp[0]*dp[0]=1 dp[1]=dp[0]∗dp[0]=1
- n = 2 时,根节点可以为1或者2,为1时左边节点数=0,右边节点数=1;为2时左边节点数=1,右边节点数=0, d p [ 2 ] = d p [ 0 ] ∗ d p [ 1 ] + d p [ 1 ] ∗ d p [ 0 ] = 2 dp[2]=dp[0]*dp[1]+dp[1]*dp[0]=2 dp[2]=dp[0]∗dp[1]+dp[1]∗dp[0]=2
- n = 3 时,根节点可以为1或者2或者3,为1时左边节点数=0,右边节点数=2;为2时左边节点数=1,右边节点数=1;为3时左边节点数=2,右边节点数=0, d p [ 3 ] = d p [ 0 ] ∗ d p [ 2 ] + d p [ 1 ] ∗ d p [ 1 ] + d p [ 2 ] ∗ d p [ 0 ] = 3 dp[3]=dp[0]*dp[2]+dp[1]*dp[1]+dp[2]*dp[0]=3 dp[3]=dp[0]∗dp[2]+dp[1]∗dp[1]+dp[2]∗dp[0]=3
由此可以得出卡塔兰数列的递推式为:
C
n
+
1
=
∑
i
=
0
n
C
i
C
n
−
i
n
>
0
C_{n+1}=\sum_{i=0}^nC_iC_{n-i} \qquad n>0
Cn+1=i=0∑nCiCn−in>0
【详细代码】
public int numTrees(int n) {
int [] G = new int[n+1];
G[0] = G[1] = 1;
for(int i=2; i<=n; ++i) {
for(int j=0; j<i; ++j) {
G[i] += G[j] * G[i-j-1];
}
}
return G[n];
}
帮到你了吗,点在看吧♥◠‿◠ノ