1,题目要求
Given n, how many structurally unique BST’s (binary search trees) that store values 1 … n?
Example:
- Input: 3
- Output: 5
- Explanation:
Given n = 3, there are a total of 5 unique BST’s:
给定n,有多少结构上唯一的BST(二叉搜索树)存储值1 … n?
2,题目思路
对于这道题,所要求的是给定一个数字n,求出从1到n的所有数字所构成的二叉搜索树的种类。
这道题,我们利用动态规划的方法来做。
假设给定了n,则我们有序列1,2,3,…,n。为了构造这个BST。
如果我们用数字i作为当前的BST的根节点,那么:
- 子序列1,2,…,i-1在左子树中;
- 子序列i+1,i+2,…,n在右子树中。
于是,我们就可以递归的构建整棵树。
因此,我们有函数:
- G(n):长度为n的BST的个数;
- F(i, n), 1 <= i <= n:以节点i为根节点,且长度为n的BST的个数。
因此,我们只需要求出G(n)即可,而G(n):
- G(n) = F(1, n) + F(2, n) + … + F(n, n).
同时,我们有:
- G(0) = 1:空树
- G(1) = 1:仅有一个根节点
而对于F(i, n)的含义,比如F(3, 7),说明根节点是3,因此左子树的子序列应该是[1,2],而右子书序列为[4,5,6,7]。
而左右子树:
- 左子树的BST种类数为:G(2)
- 右子树的BST种类数为:G(4)
因此,F(3,7) = G(2) * G(4)
之所以是所有种类,所以是左右种类乘积。
因此:
- F(i, n) = G(i-1) * G(n - i)
总结起来:
- G(n) = G(0) * G(n-1) + G(1) * G(n-2) + … + G(n-1) * G(0)
3,代码实现
static auto speedup = [](){
ios::sync_with_stdio(false);
cin.tie(nullptr);
return nullptr;
}();
class Solution {
public:
int numTrees(int n) {
vector<int> treeDP (n+1, 0);
treeDP[0] = 1;
treeDP[1] = 1;
for(int i =2;i<=n;i++)
for(int j = 1;j<=i;j++)
treeDP[i] += treeDP[j-1]*treeDP[i-j];
return treeDP[n];
}
};