96. 不同的二叉搜索树
给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?
示例:
输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树:
题解
要构建不同的二叉树,只要根节点不同,那么一定是不同的二叉树。因此,考虑以每个数值为根节点,构建左右子树不同的二叉树,最后可以得到所有二叉树。
G(n): 长度为 n 的序列能构成的不同二叉搜索树的个数。
F(i, n): 以 i 为根、序列长度为 n 的不同二叉搜索树个数 (1≤i≤n)。
最后需要求得:G(n)
其中,G(0)=1,G(1)=1
对于以i为根节点,分为左右子树,则可以得到长度为i-1的左子树构成的不同二叉树集合,个数为G(i-1);长度为n-i的左子树构成的不同二叉树集合,个数为G(n-i)。因此,以i为根节点的二叉树一共有的种类是左右子树的笛卡尔积,种类和是G(i-1)*G(n-i)。
因此,可得:
class Solution {
public int numTrees(int n) {
int[] G=new int[n+1];
G[0]