Unique Binary Search Tree | LeetCode
2014-10-21 10:45
507 查看
Given n, how many structurally unique BST's (binary search trees) that store values 1...n?
For example,
Given n = 3, there are a total of 5 unique BST's.
上面的程序是可以ac的,但是时间复杂度是O(n2),空间复杂度是O(n)。下面我们再介绍一种时间效率更高的方法,时间复杂度为O(n)。这里要引入一个叫Catalan(卡塔兰)数的概念,如果C(0)=1,C(1)=1,C(2)=2,...,C(n) = C(0)*C(n-1)+C(1)*C(n-2)+C(2)*C(n-2)+...+C(n-1)*C(0)=C(2n,n)/(n+1) (n=0,1,2,3....)
另类地推公式
C(n) = C(n-1)*(4n-2)/(n+1) (n=0,1,2,3....)
或者 C(n) = C(2n,n)-C(2n,n-1) (n=0,1,2,3...)
通过测试上面我们的几个例子发现,我们的所要求的二叉搜索树的个数就是卡塔兰数。
Java:
For example,
Given n = 3, there are a total of 5 unique BST's.
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3 通过仔细分析题目的规律,我们发现可以尝试通过动态规划的方法去解决。假设f(n)表示不同的二叉搜索树的个数,假设二叉搜索树的根为k(1<=k<=n),左子树的个数为k-1个,右子树的个数为n-k,左右子树分别都是二叉搜索树,因此依照定义,左子树的不同个数为f(k-1),右子树的个数为f(n-k),则根为k时的不同的二叉搜索树的个数为f(k-1)f(n-k),考虑到k的取值氛围,则所有的二叉搜索树的个数为f(n)=∑f(k-1)f(n-k)(k=1,2,...,n)。 得到递归的公式之后,我们可以很容易的写出程序: Java:
public class Solution { public int numTrees(int n){ int f[] = new int[n+1]; f[0] = 1; for (int i = 1; i < f.length; i++) { for (int j = 1; j <= i; j++) { f[i] += f[j-1]*f[i-j]; } } return f ; } }
上面的程序是可以ac的,但是时间复杂度是O(n2),空间复杂度是O(n)。下面我们再介绍一种时间效率更高的方法,时间复杂度为O(n)。这里要引入一个叫Catalan(卡塔兰)数的概念,如果C(0)=1,C(1)=1,C(2)=2,...,C(n) = C(0)*C(n-1)+C(1)*C(n-2)+C(2)*C(n-2)+...+C(n-1)*C(0)=C(2n,n)/(n+1) (n=0,1,2,3....)
另类地推公式
C(n) = C(n-1)*(4n-2)/(n+1) (n=0,1,2,3....)
或者 C(n) = C(2n,n)-C(2n,n-1) (n=0,1,2,3...)
通过测试上面我们的几个例子发现,我们的所要求的二叉搜索树的个数就是卡塔兰数。
Java:
public class Solution{ public int numTrees(int n){ int answer = 1; for (int i = 1; i <= n; i++) { answer = (answer*(4*i-2))/(i+1); } return answer; } }
相关文章推荐
- LeetCode – Refresh – Unique Binary Search Tree
- LeetCode – Refresh – Unique Binary Search Tree II
- Leetcode: Unique Binary Search Tree II
- [LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析
- [leetcode][tree] Unique Binary Search Trees II
- Unique Binary Search Tree -- LeetCode
- LeetCode解题报告—— Unique Binary Search Trees & Binary Tree Level Order Traversal & Binary Tree Zigzag Level Order Traversal
- leetCode 96:Unique Binary Search Tree
- 【Leetcode】Unique Binary Search Tree II (DP)
- leetcode unique binary search Tree
- Leetcode练习- Unique Binary Search Tree
- LeetCode Week10: Edit Distance, Unique Binary Search Tree(I & II)
- Unique Binary Search Tree II | LeetCode
- LeetCode题库解答与分析——#95. 不同的二叉查找树 IIUniqueBinarySearchTreeII
- [Leetcode]Unique binary search tree
- [LeetCode] Unique Binary Search Tree
- Unique Binary Search Tree II -LeetCode
- 【Leetcode】Unique Binary Search Tree in JAVA
- [leetcode][tree] Unique Binary Search Trees
- LeetCode 95 Unique Binary Search Tree II(Python详解及实现)