首页 > 编程语言 > 详细

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

时间:2020-04-02 22:31:51      阅读:70      评论:0      收藏:0      [点我收藏+]

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

 

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

原文:https://www.cnblogs.com/Dancing-Fairy/p/12622740.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!