题目
Given n, how many structurally unique BST’s (binary search trees) that store values 1…n?
For example,
Given n = 3, there are a total of 5 unique BST’s.
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
题意
求节点为1…n的搜索二叉树有多少种
分析
用动态规划求解:
- 一个特点: 对于相同长度的序列组成的树,比如[1,2,3]和[4,5,6], 他们组成的子树数量是一样的. 因此, 只需要考虑构成子树的节点数量.
- 用 F(n) 表示节点数为n的搜索二叉树的数量
- 因为可以选择1…n作为根节点, 所以假设i为选中的根节点,则
F(n)=F(i−1)∗F(n−i)
因为搜索二叉树的特点,根节点i的左子树上的节点肯定都比i小,所以左子树上有i-1个结点, 同理右子树上有n-i个结点. 状态转移方程:
对于节点数为n的时候, 只需要考虑切分成节点数[1, n-1]的子树的数量, 即每次只会更新dp[n], 依赖dp[1,…, n-1]的值. 所以只需要一维数组存储.例子:
复杂度是 O(N2)
实现
class Solution {
public:
int numTrees(int N) {
vector<int> dp(N+1, 0);
dp[0] = dp[1] = 1;
for(int n = 2; n <= N; n++) {
for(int i = 1; i <= n; i++) {
dp[n] += dp[i-1] * dp[n-i];
}
}
return dp[N];
}
};
Runtime: 0 ms
其他方法
用卡特兰数直接求解