思路:设 ret[i] 表示序列 1 到 i 的所有搜索二叉树的个数,那么在这些数中,必有一个数 k ∈ [1, i] 处在根节点位置,那么左子树的所有节点都小于 k,右子树的所有节点都大于 k,所以,当 k 处于根节点位置时,此时的树有 ret[k-1] * ret[i - k ] 棵,ret[k-1]表示小于k 的左子树个数,ret[i-k]表示大于k的右子树个数。依次求和所有k值,得到最后的结果,即ret[i] = ∑_k (ret[k-1] * ret[i-k]), k属于[1,i]。
code:
class Solution {
public:
int numTrees(int n) {
int *ret = new int[n+1];
ret[0] = 1;
ret[1] = 1;
for(int i = 2;i<=n;i++){
ret[i] = 0;
for(int j = 1;j <= i;j++)
ret[i] += (ret[i - j] * ret[j - 1]);
}
return ret[n];
}
};