Given n, how many structurally unique BST’s (binary search trees) that store values 1 … n?
Example:
Input: 3Output: 5Explanation: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
题意
给定n个整数1,2,…,n,用这些整数构成二叉搜索树的结点。求共可以形成多少符合规范的二叉搜索树。
思路
实际上有点类似于排列组合。如果两棵树的结点数相同,但它们的根节点不同,那么这两颗树一定不同;而当根结点相同时,只要左右子树结构不同,那么这两棵树还是不同的。所以对于n个整数,我们每次选取一个整数作为根结点,统计所有不同左右子树的组合数,得到的就是以该整数为根结点构成的不同树的数量,再变换根结点累加所有这样的值,得到的就是最终答案。
假设n个整数构成的不同的BST的数目为T(n),而在n个整数中选取一个 i 作为根结点得到的不同的BST的数目为t(n, i),则可以得到:

普遍情况可以得到如下公式:
代码实现 - 递归
class Solution {Map<Integer, Integer> record = new HashMap<>();public int numTrees(int n) {if (n == 0 || n == 1) {return 1;}int count = 0;if (record.containsKey(n)) {count = record.get(n);} else {for (int i = 1; i <= n; i++) {count += numTrees(i - 1) * numTrees(n - i);}record.put(n, count);}return count;}}
代码实现 - 迭代
class Solution {public int numTrees(int n) {if (n == 0 || n == 1) {return 1;}int[] record = new int[n + 1];record[0] = 1;record[1] = 1;for (int i = 2; i <= n; i++) {for (int j = 1; j <= i; j++) {record[i] += record[j - 1] * record[i - j];}}return record[n];}}
