题目
给你一个整数 n
,求恰由 n
个节点组成且节点值从 1
到 n
互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例 1:
输入:n = 3 输出:5
示例 2:
输入:n = 1 输出:1
提示:
1 <= n <= 19
解答
源代码
class Solution {
public int numTrees(int n) {
int[] G = new int[n + 1];
G[0] = 1;
G[1] = 1;
// i表示二叉搜索树共有i个结点,j表示根节点为j
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= i; j++) {
G[i] += G[j - 1] * G[i - j];
}
}
return G[n];
}
}
总结
这题主要是通过数学知识总结数量规律。
用G(n)表示n个节点能够组成的二叉搜索树的数量,F(i, n)表示以i为根节点、节点数为n的二叉搜索树的数量。
G(n) = F(1, n) + F(2, n) + …… + F(n, n)
F(i, n) = G(i - 1) * G(n - i)
那么合并以上两公式就可得:
G(n) = G(0) * G(n - 1) + G(1) * G(n - 2) + …… + G(n - 1, 0)