<leetcode c++>96. 不同的二叉搜索树

给定一个整数 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);
    }

 

posted @ 2020-04-02 20:23  鳄鱼四驱车  阅读(175)  评论(0编辑  收藏  举报