链接: 点这里
使用方法: 带备忘录的递归
思路: 对于一个从1到n的节点, 其可以选择每个节点作为根节点, 共有n次选择, 左边的位于根节点的左边, 右边的位于根节点的右边, 这是左子树和右子树的情况判断与当前树一样, 所以可以递归求解, 当前树的结果为左子树的个数*右子树的个数, 由于从1到n和从2到n+1所能构造的搜索数的数量是一致的, 所以只需要以数组的范围为key, 情况个数为value记录即可
class Solution {
public:
unordered_map<int, int> m;
int func(int n) {
if (m.count(n)) return m[n];
int ans = 0;
for (int i = 0; i < n; i++) {
ans += func(i) * func(n - i - 1);
}
m[n] = ans;
return ans;
}
int numTrees(int n) {
// 初始化哈希表
m[0] = 1;
m[1] = 1;
m[2] = 2;
return func(n);
}
};