LeetCode #96 Unique Binary Search Tree
来源:互联网 发布:金山打字通mac版官网 编辑:程序博客网 时间:2024/05/20 21:58
LeetCode #96 Unique Binary Search Tree
问题描述
对于一个具有n个结点的二叉树,问具有多少种不同结构的二叉树?
算法分析
- 这题我们可以使用分治的思想来解决。
- 对于一个n个结点的二叉树,用f(n)表示其结构总数。
- 当确定了根节点后,我们需要将剩下的n-1个结点分配在根节点的左右子树上,当前结构总数就是左子树的结构总数与右子树的结构总数的乘积,故
f(n)=∑f(left)∗f(right) - 上述式子转化为实际后为
f(n)=∑i=0n−1f(i)∗f(n−i−1)
int f(int n){ if (n==0) return 1; int ans=0; for (int i=0;i<n;i++) ans+=f(i)*f(n-i-1); return ans;}
- 显然,递归很慢而且很蠢,也很容易就能改成递推了。但尽管如此,时间复杂度仍然是O(n^2)。
- 这时候,就要发挥我们扎实的数学功底了(其实我想了半天也没做出来,是舍友凭借回忆想起来的)。上述递推式,不就是卡特兰数的递推式么?
- 于是乎,根据这个定理(我也不知道怎么推出来的!看了推导也没记住……),我们得出下式:
f(n)=Cn2nn+1 - 这样的话,我们就可以用O(n)的时间复杂度解决这个问题了。
- 但是我们需要注意组合数运算过程中爆类型。可以参照一下我的代码的方法,可以使运算过程中的数字尽可能小(不能保证不爆类型)。
代码
(短的可怕)
class Solution {public: int numTrees(int n) { long long ans=1; for (long long i=1;i<=n;i++) ans=ans*(n+i)/i; ans/=(n+1); return ans; }};
0 0
- LeetCode 96: Unique Binary Search Tree
- leetCode 96:Unique Binary Search Tree
- LeetCode #96 Unique Binary Search Tree
- [LeetCode] Unique Binary Search Tree
- LeetCode : Unique Binary Search Tree
- 【LeetCode】Unique Binary Search Tree
- [Leetcode]Unique binary search tree
- Unique Binary Search Tree -- LeetCode
- LeetCode 96 Unique Binary Search Tree(Python详解及实现)
- Leetcode: Unique Binary Search Tree II
- Leetcode - Tree /Dynamic Programming- Unique Binary Search
- Leetcode练习- Unique Binary Search Tree
- leetcode java unique binary search tree
- 【Leetcode】Unique Binary Search Tree II (DP)
- 【Leetcode】Unique Binary Search Tree in JAVA
- leetcode-unique binary search tree II
- Unique Binary Search Tree II -LeetCode
- [leetcode][tree] Unique Binary Search Trees
- 实现一个Web内容片段收集引擎的设想
- Spring MVC 流程图
- 使用C语言进行面向对象的开发--GObject入门[8]
- 我的第一个shader程序
- &与&&有什么区别?
- LeetCode #96 Unique Binary Search Tree
- RequireJS - 用法
- 用4个骰子表示月份和日期
- 自动装箱与拆箱
- Shader山下(十七)语义Semantic
- select 下拉框和下拉列表美化
- Spring之IOC
- 解决android4.4以后 媒体库打开闪退的问题
- java命令执行jar包(里面的main函数,无web.xml文件)的方式(包括依赖其它的jar包),使用Google-Guava Concurrent包里的Service框架,maven工程