概述
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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处
最后
以上就是火星上钢笔为你收集整理的不同的搜索二叉树个数--动态规划leetcode 96的全部内容,希望文章能够帮你解决不同的搜索二叉树个数--动态规划leetcode 96所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复