Given an integer 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
建树的时候,以选中的元素为中心,一分为二,比选中元素小的进入左子树,比选中元素大的进入右子树。例如n=5,12345可选:
每次选中了一个元素作为根,然后根加上左右子树的所有组合是当前可能构成的集合,层层向上返回。
public class Solution {
public List<TreeNode> generateTrees(int n)
{
if(n==0)
return new ArrayList<>();
int[] arr=new int[n];
for(int i=0;i<n;i++)
arr[i]=i+1;
ArrayList<TreeNode> retlist=buildtree(0, n-1, arr);
return retlist;
}
public ArrayList<TreeNode> buildtree(int start,int end,int[] arr)
{
ArrayList<TreeNode> retlist=new ArrayList<>();
if(start>end)
{
retlist.add(null);
return retlist;
}
if(start==end)
{
retlist.add(new TreeNode(arr[start]));
return retlist;
}
TreeNode root = null;
for(int i=start;i<=end;i++)
{
ArrayList<TreeNode> leftlist=buildtree(start, i-1, arr);
ArrayList<TreeNode> rightlist=buildtree(i+1, end, arr);
for(TreeNode tnl : leftlist)
for(TreeNode tnr :rightlist)
{
root=new TreeNode(arr[i]);
root.left=tnl==null?null:tnl;
root.right=tnr==null?null:tnr;
retlist.add(root);
}
}
return retlist;
}
}
上面的程序通过改动arr数组实际上可以求从一个长度为n的的数组里取数可以构成所有的BST
例如[8,2,6,14,9]求所有可以构成的BST,先按升序排列变成[2,6,8,9,14]
这样就满足了划分条件(当前做根的元素左边元素比根小进入左子树,右边比根大进入右子树)
再求可以构成所有的BST组合,这里只要求1~n的节点构成所有的BST,数组其实可以省略。
public class Solution {
public List<TreeNode> generateTrees(int n)
{
if(n==0)
return new ArrayList<>();
ArrayList<TreeNode> retlist=buildtree(1, n);
return retlist;
}
public ArrayList<TreeNode> buildtree(int start,int end)
{
ArrayList<TreeNode> retlist=new ArrayList<>();
if(start>end)
{
retlist.add(null);
return retlist;
}
if(start==end)
{
retlist.add(new TreeNode(start));
return retlist;
}
TreeNode root = null;
for(int i=start;i<=end;i++)
{
ArrayList<TreeNode> leftlist=buildtree(start, i-1);
ArrayList<TreeNode> rightlist=buildtree(i+1, end);
for(TreeNode tnl : leftlist)
for(TreeNode tnr :rightlist)
{
root=new TreeNode(i);
root.left=tnl==null?null:tnl;
root.right=tnr==null?null:tnr;
retlist.add(root);
}
}
return retlist;
}
}