096 Unique Binary Search Trees [Leetcode]
2015-09-04 17:41
549 查看
题目内容:
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.
思路:
还是递归的思路。关于树的题目,基本都能够从把一棵树分解成左右子树这样的子问题进行求解。这个题也不例外。
因为限定的条件是左右子树,一开始非常困惑找不到切入点,虽然知道可以分解为左右子树的子问题,但对于子问题的求解方式,也就是子树个数的计数感到困惑。如何统计unique的种数呢?
题目中还有一个条件没有被用到。那就是要构建的是一棵特殊的树——binary search tree。也就是说,所有左子树的节点小于根节点,所有右子树上的节点大于根节点。以[1, …, n]为基础构建BST时,如果选定了以i为根,那么左子树上的节点就是[1, 2, …, i-1],构成右子树的节点就是[i+1, i+2, …, n]。这样子问题就完全符合了。
下面自底向上观察子问题的求解。
当节点个数为0时,也就是空树,那么毫无疑问f(0) = 1.
当节点个数为1时,情况也唯一,f(1) = 1.
当节点个数大于等于2时,问题就变得有趣了。一棵树可以分解为左子树和右子树,而它的构成种数也就是(左子树的构成种数*右子树的构成种数)。假设有n个节点,那么他的子树中的节点有n-1个。左子树的节点个数可以是从0~n-1个,相对应的右子树的节点个数就是n-1~0个。
也就是说,f(n) = ∑ f(i) * f(n-1-i) 0 <= i < n-1
代码的思路很清楚了。
代码如下,运行时间0ms:
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.
思路:
还是递归的思路。关于树的题目,基本都能够从把一棵树分解成左右子树这样的子问题进行求解。这个题也不例外。
因为限定的条件是左右子树,一开始非常困惑找不到切入点,虽然知道可以分解为左右子树的子问题,但对于子问题的求解方式,也就是子树个数的计数感到困惑。如何统计unique的种数呢?
题目中还有一个条件没有被用到。那就是要构建的是一棵特殊的树——binary search tree。也就是说,所有左子树的节点小于根节点,所有右子树上的节点大于根节点。以[1, …, n]为基础构建BST时,如果选定了以i为根,那么左子树上的节点就是[1, 2, …, i-1],构成右子树的节点就是[i+1, i+2, …, n]。这样子问题就完全符合了。
下面自底向上观察子问题的求解。
当节点个数为0时,也就是空树,那么毫无疑问f(0) = 1.
当节点个数为1时,情况也唯一,f(1) = 1.
当节点个数大于等于2时,问题就变得有趣了。一棵树可以分解为左子树和右子树,而它的构成种数也就是(左子树的构成种数*右子树的构成种数)。假设有n个节点,那么他的子树中的节点有n-1个。左子树的节点个数可以是从0~n-1个,相对应的右子树的节点个数就是n-1~0个。
也就是说,f(n) = ∑ f(i) * f(n-1-i) 0 <= i < n-1
代码的思路很清楚了。
代码如下,运行时间0ms:
class Solution { public: int numTrees(int n) { if(n == 1) return 1; vector<int> f(n+1, 0); f[0] = f[1] = 1; for(int i = 2; i <= n; ++i) { for(int j = 0; j < i; ++j) { f[i] += f[j]*f[i-j-1]; } } return f ; } };
相关文章推荐
- OPEN(SAP) UI5 学习入门系列之三:MVC (上) - 模型
- iphone开发之UIImagePickerController组件的预习————用于照相和打开图库
- POJ 1679 The Unique MST
- hdoj 1047 Integer Inquiry 【多个大数相加】
- XCode Build Settings中几种Search Paths
- XCode Build Settings中几种Search Paths
- SwipeRefreshLayout.setRefreshing(true)不起作用解决办法
- dojo小例子(33)dojo.request.script通过JSONP实现跨域
- vc如何在GUI界面下显示命令窗
- arduino uno接口部分介绍
- UITabBarItem改变字体颜色
- Warning: Multiple build commands for output file /xxx
- 1051. Pop Sequence (25)
- HDU 5412 CRB and Queries 求区间第k小 CDQ分治+整体二分
- iOS:UIScrollView控件和UIPageControl控件的详解
- 01-复杂度2 Maximum Subsequence Sum (25分)
- [flume]AvroRuntimeException: Excessively large list allocation request detected
- POJ 题目3368 ||HDOJ 题目1806 Frequent values(RMQ)
- 用于打印UID和GID
- iOS 在UILabel显示不同的字体和颜色