LeetCode Unique Binary Search Trees
2015-12-05 16:42
405 查看
题目:
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.
标签: Tree Dynamic Programming
分析
如果把上例的顺序改一下,就可以看出规律了。
\begin{Code}
1 1 2 3 3
\ \ / \ / /
3 2 1 3 2 1
/ \ / \
2 3 1 2
\end{Code}
比如,以1为根的树的个数,等于左子树的个数乘以右子树的个数,左子树是0个元素的树,右子树是2个元素的树。以2为根的树的个数,等于左子树的个数乘以右子树的个数,左子树是1个元素的树,右子树也是1个元素的树。依此类推。
当数组为 $1,2,3,…,n$时,基于以下原则的构建的BST树具有唯一性:
\textbf{以i为根节点的树,其左子树由[1, i-1]构成, 其右子树由[i+1, n]构成。}
定义$f(i)$为以$[1,i]$能产生的Unique Binary Search Tree的数目,则
如果数组为空,毫无疑问,只有一种BST,即空树,$f(0)=1$。
如果数组仅有一个元素{1},只有一种BST,单个节点,$f(1)=1$。
如果数组有两个元素{1,2}, 那么有如下两种可能
\begin{Code}
1 2
\ /
2 1
\end{Code}
f(2)=+f(0)∗f(1) ,1为根的情况f(1)∗f(0) ,2为根的情况
再看一看3个元素的数组,可以发现BST的取值方式如下:
f(3)=++f(0)∗f(2) ,1为根的情况f(1)∗f(1) ,2为根的情况f(2)∗f(0) ,3为根的情况
所以,由此观察,可以得出$f$的递推公式为
f(i)=∑k=1if(k−1)×f(i−k)
附代码:
public class Solution <span style="font-family: Arial, Helvetica, sans-serif;">{</span>
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.
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
标签: Tree Dynamic Programming
分析
如果把上例的顺序改一下,就可以看出规律了。
\begin{Code}
1 1 2 3 3
\ \ / \ / /
3 2 1 3 2 1
/ \ / \
2 3 1 2
\end{Code}
比如,以1为根的树的个数,等于左子树的个数乘以右子树的个数,左子树是0个元素的树,右子树是2个元素的树。以2为根的树的个数,等于左子树的个数乘以右子树的个数,左子树是1个元素的树,右子树也是1个元素的树。依此类推。
当数组为 $1,2,3,…,n$时,基于以下原则的构建的BST树具有唯一性:
\textbf{以i为根节点的树,其左子树由[1, i-1]构成, 其右子树由[i+1, n]构成。}
定义$f(i)$为以$[1,i]$能产生的Unique Binary Search Tree的数目,则
如果数组为空,毫无疑问,只有一种BST,即空树,$f(0)=1$。
如果数组仅有一个元素{1},只有一种BST,单个节点,$f(1)=1$。
如果数组有两个元素{1,2}, 那么有如下两种可能
\begin{Code}
1 2
\ /
2 1
\end{Code}
f(2)=+f(0)∗f(1) ,1为根的情况f(1)∗f(0) ,2为根的情况
再看一看3个元素的数组,可以发现BST的取值方式如下:
f(3)=++f(0)∗f(2) ,1为根的情况f(1)∗f(1) ,2为根的情况f(2)∗f(0) ,3为根的情况
所以,由此观察,可以得出$f$的递推公式为
f(i)=∑k=1if(k−1)×f(i−k)
附代码:
public class Solution <span style="font-family: Arial, Helvetica, sans-serif;">{</span>
02 public int numTrees(int n) { 03 int dp[] = new int[n+1]; 04 dp[0] = dp[1] = 1; 05 for(int i=2; i<=n; i++){ 06 for(int k=1; k<=i; k++){ 07 dp[i] += dp[k-1] * dp[i-k]; 08 } 09 } 10 return dp ; 11 } 12 }
相关文章推荐
- Code Forces 590 B. Chip 'n Dale Rescue Rangers(二分)
- UI基础-图片异步下载、KVO
- UI Storyboard
- Error Domain=com.alamofire.error.serialization.response Code=-1016 "Request failed: unacceptable con
- error: aggregate value used where an integer was expected
- Range Sum Query - Immutable
- iOS-----使用NSOperation与NSOperationQueue实现多线程
- 黑马程序员---GUI(布局管理器、事件)
- NGUI类之间的关系和架构
- NGUI类之间的关系和架构
- UITableView 一直显示滚动条(ScrollBar Indicators)、滚动条Width(宽度)、滚动条Color(颜色)
- Android UI效果实现 滑动模糊渐变效果实现
- 比较转发与重定向和Cookie
- iOS 8 Auto Layout界面自动布局系列2-使用Xcode的Interface Builder添加布局约束
- String家族--String、StringBuffer、StringBuilder
- (4)用DuiCreator的DuiLib类向导,加速多窗口程序制作
- 随意细解:UI -- KVO、图片异步下载
- android 蓝牙bluetooth 4.2.2搜索蓝牙功能实现
- CASIO 键盘 按键和 C# keycode keyvalue 值对应关系
- android 蓝牙Bluetooth 4.2.2打开蓝牙实现