给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
示例:
输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 / / / 3 2 1 1 3 2 / / 2 1 2 3
很容易知道:n=0时,kind=0;n=1,kind=1; n=2, kind=2......于是我们就可以考虑递归,从1~n每个节点分别做根结点,结点i做根结点时的种类数 = 左子树1~i-1和右子树i+1~n的种类数相乘。
即 f(n) = f(0)*f(n-1) + f(1)*f(n-2)+......+f(n-1)*f(0);
(如果直接写递归代码,里面会有大量重复计算,比如先算了一遍 f(n-1) , 然后又计算了一遍 f(n-1) ,可以用数组保留中间结果,这应该是简单的记忆化搜索吧)
int h(int n, vector<int>& memo){ if(n<=1)return 1; int ans=0,s,t; for(int i=0;i<n;i++){ s = memo[i]==0? h(i, memo) : memo[i]; t = memo[n-i-1]==0? h(n-i-1, memo) : memo[n-i-1]; ans+=s*t; } memo[n]=ans; return ans; } int numTrees(int n) { vector<int> memo(n+2,0); return h(n,memo); }