不同的搜索二叉树个数--动态规划

leetcode 96

不同的二叉搜索树个数

题目描述:给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?

示例

输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3

解法:动态规划

思路:找出所有种类二叉搜索树,我们一般想到的就是,从根节点出发,左右孩子的二叉搜索树类型个数加上1就是从总的二叉搜索树个数,也就是这其实可以用动态规划的思想解题,我们可以通过递推的方式求出所有的二叉搜索树总和

设n个节点的二叉搜索树个数为G(n),f(i)为以i为根的二叉搜索树个数,则

G(n)=f(1)+f(2)+f(3)+...+f(n)

上面的f(1)->f(n)其实就是拥有n个节点的树的所有孩子节点(包括根节点本身),所以这就印证了我们前面的思路了

我们看一下f(i)又等于什么?

f(i)=G(i-1)*G(n-i)

如何理解这一公式?

我们知道,G(i-1)就是i节点左孩子二叉搜索树的总数,G(n-i)就是i节点右孩子二叉搜索树的总数,所以它们相乘的结果就是f(i)了

因此我们可以得到公式

G(n)=G(0)*G(n-1)+G(1)*G(n-2)+...+G(n-1)*G(0)

完整代码

int numTrees(int n){
    int dp[n+1];
    dp[0]=1;
    dp[1]=1;
    int i, j;
    for(i=2; i<n+1; i++)
        dp[i]=0;
    for(i=2; i<n+1; i++)
    {
        for(j=1; j<i+1; j++)
            dp[i] += dp[j-1]*dp[i-j];	
    } 
    return dp[n];
}

在这里插入图片描述

心得体会:
其实自己在解答该题时,思路是正确的,但是却卡在如何寻找左右孩子二叉树的种类上,没想到用一个公式就可以解决了,或许这就是动态规划的强大之处吧

题目来源以及解法参考:

作者:LeetCode-Solution

链接:https://leetcode-cn.com/problems/count-square-submatrices-with-all-ones/solution/tong-ji-quan-wei-1-de-zheng-fang-xing-zi-ju-zhen-2/

来源:力扣(LeetCode)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处

猜你喜欢

转载自blog.csdn.net/jump_into_zehe/article/details/106378931