还是两种解法

1.DP:

int numTrees(int n) {
        if(n <= 0) return 0;
        vector<int> dp(n+1, 0);
        dp[0] = 1;
        for(int i=1; i<=n; i++){
            for(int j=0; j<i; j++){
                dp[i] += dp[j] * dp[i-1-j];
            }
        }
        return dp[n];
    }
class Solution {
public:
    unordered_map<int, int> mp;
    int numTrees(int n) {
        if(n == 0 || n == 1) return 1;
        else if(mp.count(n)) return mp[n];
        int res = 0;
        for(int i=0; i<n; i++){
            res += numTrees(i) * numTrees(n-1-i);
        }
        mp[n] = res;
        return res;
    }
};