递归求解....对于BST来说,比根节点小的点构成了根的左子树,大的点构成了右子树.....循环每个点作为根节点,递归查找到所有可能的左子树和右子树的组合即可。
/**
* 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) {
// if(n<1)
// {
// List<TreeNode> res = new ArrayList<TreeNode>();
// TreeNode r = null;
// res.add(r);
// return res;
// }
return fun(1,n);
}
List<TreeNode> fun(int left,int right)
{
List<TreeNode> res = new ArrayList<TreeNode>();
if(right<left)
{
res.add(null);
return res;
}
for(int i=left;i<=right;i++)
{
//TreeNode root = new TreeNode(i);
List<TreeNode> leftList = fun(left,i-1);
List<TreeNode> rightList = fun(i+1,right);
for(int j=0;j<leftList.size();j++)
{
for(int k=0;k<rightList.size();k++)
{
TreeNode root = new TreeNode(i);
res.add(root);
root.left = leftList.get(j);
root.right = rightList.get(k);
}
}
}
return res;
}
}