思路:设 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];
}
};
本文介绍了一种计算不同形态的搜索二叉树数量的方法。通过动态规划思想,利用ret数组记录从1到i的所有可能搜索二叉树的数量,递推公式为ret[i]=∑_k(ret[k-1]*ret[i-k]),最终得出n个节点的所有搜索二叉树数量。
817

被折叠的 条评论
为什么被折叠?



