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
递归方法超时。
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; left = null; right = null; }
* }
*/
public class Solution {
public List<TreeNode> generateTrees(int n) {
List<TreeNode> res=new LinkedList<TreeNode>();
if(n<=0) return res;
boolean []vis=new boolean[n+1];
for(int i=1;i<=n;i++){
TreeNode tree=new TreeNode(i);
vis[i]=true;
buildTree(1,i,n,vis,tree,res);
vis[i]=false;
}
return res;
}
public void buildTree(int size,int curr,int n,boolean []vis,TreeNode tree,List<TreeNode> res){
if(size==n){
TreeNode t=tree;
res.add(t);
return;
}
for(int i=1;i<=n;i++){
if(!vis[i]){
vis[i]=true;
if(i>curr){
tree.right=new TreeNode(i);
buildTree(size+1,i,n,vis,tree.right,res);
tree.right=null;
}
else if(i<curr){
tree.left=new TreeNode(i);
buildTree(size+1,i,n,vis,tree.left,res);
tree.left=null;
}
}
vis[i]=false;
}
}
}
改进版
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; left = null; right = null; }
* }
*/
public class Solution {
public List<TreeNode> generateTrees(int n) {
return constructCore(1,n);
}
public ArrayList<TreeNode> constructCore(int start,int end){
ArrayList<TreeNode> res=new ArrayList<TreeNode>();
if(start>end){
res.add(null); return res;
}
for(int i=start;i<=end;i++){
ArrayList<TreeNode> left=constructCore(start,i-1);
ArrayList<TreeNode> right=constructCore(i+1,end);
TreeNode node=null;
for(int j=0;j<left.size();j++){
for(int k=0;k<right.size();k++){
node=new TreeNode(i);
node.left=left.get(j);
node.right=right.get(k);
res.add(node);
}
}
}
return res;
}
}