Unique Binary Search Trees II
2016-06-01 14:22
561 查看
题目描述:
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.
For example,
Given n = 3, your program should return all 5 unique BST's shown below.
解题思路:
在1-n中取任意一个为根节点root,大小为i,然后,将所有的数分成1-(i-1)和(i+1)-n两个子集合,然后再取得两个子集合得到的数,作为它的左子树和右子树即可。
在这里注意,如果左子树为空,就将右子树作为拼接,如果右子树为空,就将左子树拼接,只有两个都不为空的时候才能用双层for循环.
代码如下:
public class Solution {
public List<TreeNode> generateTrees(int n) {
return getArrayList(1, n);
}
public List<TreeNode> getArrayList(int left,int right){
List<TreeNode> result=new ArrayList<TreeNode>();
if(left>right)
return result;
if(left==right){
result.add(new TreeNode(left));
return result;
}
for(int i=left;i<=right;i++){
List<TreeNode> leftList=getArrayList(left, i-1);
List<TreeNode> rightList=getArrayList(i+1, right);
if(leftList.size()==0){
for(int j=0;j<rightList.size();j++){
TreeNode root=new TreeNode(i);
root.right=rightList.get(j);
result.add(root);
}
}
if(rightList.size()==0){
for(int j=0;j<leftList.size();j++){
TreeNode root=new TreeNode(i);
root.left=leftList.get(j);
result.add(root);
}
}
for(int j=0;j<leftList.size();j++){
for(int k=0;k<rightList.size();k++){
TreeNode root=new TreeNode(i);
root.left=leftList.get(j);
root.right=rightList.get(k);
result.add(root);
}
}
}
return result;
}
}
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.
For example,
Given n = 3, your program should return all 5 unique BST's shown below.
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
解题思路:
在1-n中取任意一个为根节点root,大小为i,然后,将所有的数分成1-(i-1)和(i+1)-n两个子集合,然后再取得两个子集合得到的数,作为它的左子树和右子树即可。
在这里注意,如果左子树为空,就将右子树作为拼接,如果右子树为空,就将左子树拼接,只有两个都不为空的时候才能用双层for循环.
代码如下:
public class Solution {
public List<TreeNode> generateTrees(int n) {
return getArrayList(1, n);
}
public List<TreeNode> getArrayList(int left,int right){
List<TreeNode> result=new ArrayList<TreeNode>();
if(left>right)
return result;
if(left==right){
result.add(new TreeNode(left));
return result;
}
for(int i=left;i<=right;i++){
List<TreeNode> leftList=getArrayList(left, i-1);
List<TreeNode> rightList=getArrayList(i+1, right);
if(leftList.size()==0){
for(int j=0;j<rightList.size();j++){
TreeNode root=new TreeNode(i);
root.right=rightList.get(j);
result.add(root);
}
}
if(rightList.size()==0){
for(int j=0;j<leftList.size();j++){
TreeNode root=new TreeNode(i);
root.left=leftList.get(j);
result.add(root);
}
}
for(int j=0;j<leftList.size();j++){
for(int k=0;k<rightList.size();k++){
TreeNode root=new TreeNode(i);
root.left=leftList.get(j);
root.right=rightList.get(k);
result.add(root);
}
}
}
return result;
}
}
相关文章推荐
- iOS UIBezierPath图形绘制
- SUID和SGID位简介
- Geometry cannot have Z values.
- org.hibernate.QueryException:Expected positional parameter count: 1
- UIScrollView的PageEnable可以实现slider
- Import Project...出现 Building 'xxxx' Gradle project info会卡半天,完美解决
- 斐波那契数列-Fibonacci Sequence
- LTE UE不活动定时器的工作机制
- 监听UITextField内容改变简单方法
- Uedit32和Ubuntu 选定跳转
- 关于xib中要TableviewCell的自定义心得
- 动态加载HTML后使用query修改标签样式
- iOS控件之UISegmentedControl
- iOS控件之UISlider
- iOS控件之UITextField
- UI适配攻略!安卓&苹果碎片化
- iOS控件之UIButton
- 五分钟搞懂Android的消息机制(Handle,Looper,MessageQueue)
- iOS控件之UILabel
- LeetCode:Increasing Triplet Subsequence