给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例 1:
输入:n = 3
输出:5
示例 2:
输入:n = 1
输出:1
提示:
1 <= n <= 19
我们用G[n]代表n个节点可以构成的二叉搜索树的数量。f[i]表示以i为根节点的二叉搜索树数量。
对于给定的n个节点。我们需要的结果就是G[n]。
G[n] = f[1] + f[2] + f[3] + … + f[n],也就是1-n每个数字分别做根节点的元素数量和。
那么我们看f[1]。f[1] 代表1做根节点的元素数量。那么此时,以1为根的左子树节点数量为0,右子树节点数量为n - 1, 也就是(2 到n - 1这些节点)。此时左子树0个节点可以构成的二叉搜索树的数量为G[0], 右子树为G[n - 1]。所以f[1] = G[0] * G[n - 1] 。
同理我们可以得到G[n] = f[1] + f[2] + … + f[n] = G[0] * G[n - 1] + G[1] * G[n - 2] + … + G[n - 1] * G[0]
G[1] = G[0] * G[0]
G[2] = G[0] * G[1] + G[1] * G[0]
G[3] = G[0] * G[2] + G[1] *G[1] + G[2] * G[0]
可以看到G[n] 的求解依赖于G[n -1] ,G[n-2],…G[0]的
所以我们可以从小到大求出所有的G[n]
class Solution {public: int numTrees(int n) { //G数组 vector
由上式可以推导出卡特兰数
class Solution {public: int numTrees(int n) { long long ans = 1; for(int i = 0; i < n; i ++) { ans = ans * 2 * (2 * i + 1) / (i + 2); } return (int) ans; }};
参考资料 https://leetcode-cn.com/problems/unique-binary-search-trees/solution/bu-tong-de-er-cha-sou-suo-shu-by-leetcode-solution/
https://zh.wikipedia.org/wiki/卡塔兰数