Given n, how many structurally unique BST’s (binary search trees) that store values 1 … n?

    Example:

    1. Input: 3
    2. Output: 5
    3. Explanation:
    4. Given n = 3, there are a total of 5 unique BST's:
    5. 1 3 3 2 1
    6. \ / / / \ \
    7. 3 2 1 1 3 2
    8. / / \ \
    9. 2 1 2 3

    题意

    给定n个整数1,2,…,n,用这些整数构成二叉搜索树的结点。求共可以形成多少符合规范的二叉搜索树。

    思路

    实际上有点类似于排列组合。如果两棵树的结点数相同,但它们的根节点不同,那么这两颗树一定不同;而当根结点相同时,只要左右子树结构不同,那么这两棵树还是不同的。所以对于n个整数,我们每次选取一个整数作为根结点,统计所有不同左右子树的组合数,得到的就是以该整数为根结点构成的不同树的数量,再变换根结点累加所有这样的值,得到的就是最终答案。

    假设n个整数构成的不同的BST的数目为T(n),而在n个整数中选取一个 i 作为根结点得到的不同的BST的数目为t(n, i),则可以得到:

    image.png

    普遍情况可以得到如下公式:

    96. Unique Binary Search Trees (M) - 图2

    代码实现 - 递归

    1. class Solution {
    2. Map<Integer, Integer> record = new HashMap<>();
    3. public int numTrees(int n) {
    4. if (n == 0 || n == 1) {
    5. return 1;
    6. }
    7. int count = 0;
    8. if (record.containsKey(n)) {
    9. count = record.get(n);
    10. } else {
    11. for (int i = 1; i <= n; i++) {
    12. count += numTrees(i - 1) * numTrees(n - i);
    13. }
    14. record.put(n, count);
    15. }
    16. return count;
    17. }
    18. }

    代码实现 - 迭代

    1. class Solution {
    2. public int numTrees(int n) {
    3. if (n == 0 || n == 1) {
    4. return 1;
    5. }
    6. int[] record = new int[n + 1];
    7. record[0] = 1;
    8. record[1] = 1;
    9. for (int i = 2; i <= n; i++) {
    10. for (int j = 1; j <= i; j++) {
    11. record[i] += record[j - 1] * record[i - j];
    12. }
    13. }
    14. return record[n];
    15. }
    16. }