题目地址:https://leetcode-cn.com/problems/unique-binary-search-trees/
给定一个整数 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,只有1种二叉搜索树
n = 2,有两种二叉搜索树
1 2
\ \
2 1
n = 3,有5种二叉搜索树,如题。
拆解这道题,
- 1的右边有n = 2(2,3),有2种可能
- 2的左右分别有n=1(1)和n=1(3),有1*1种可能
- 3的左边有n = 2(1,2),有2种可能
- 把以上几种可能累加,正好是5种可能
我们可以总结规律
f
n
=
∑
k
=
0
n
−
1
f
k
f
n
−
k
−
1
{f_n} = \sum\limits_{k=0}^{n-1}{f_k}{f_{n-k-1}}
fn=k=0∑n−1fkfn−k−1
f
n
{f_n}
fn就是对应n的二叉搜索树的数目。
参考代码
class Solution {
public:
int numTrees(int n) {
if (n <= 2) return n;
const int N = n + 1;
int sol[N];
sol[0] = 1;
sol[1] = 1;
sol[2] = 2;
for (int i = 3; i <= n; i++) {
sol[i] = 0;
for (int j = 0; j < i; j++) {
sol[i] += sol[j] * sol[i - j - 1];
}
}
return sol[n];
}
};