题目:给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
很容易就发现其中的规律:
对于n个节点的二叉树,若其根节点为k,左子树为1…k-1的二叉树,右子树为k+1…n的二叉树。
所以
数学结构已经非常清楚了,接下来用C++实现下:
class Solution {
public:
int arr[1000]={1,1,2};
int numTrees(int n) {
if(arr[n]!=0) return arr[n];
int sum=0;
for(int i=0;i<n;++i){
sum+=numTrees(i)*numTrees(n-1-i);
}
arr[n]=sum;
return sum;
}
};
很自然地使用了备忘录递归,但是菜鸡本质发挥,重新审视代码,发现递归和没用一样:
对于n>2的numTrees(n),显然需要递归调用numTrees(n-1),进而调用numTrees(n-2)……直到numTrees(2)。
完全可以从arr[3]迭代算到arr[n]。
菜了菜了,以此为戒。