比第一个题要求高 不但要给出个数 是要给出所有可能的树
每次确定一个root 然后 (1,root -1)就是左子树 (root+1,n)就是右子树
注意边界条件 start > end的时候要返回一个list 里面是一个null node 而不能是一个null list 因为这种情况是这个树没有左子或者右子 然后就指向null
public class Solution {
public List<TreeNode> generateTrees(int n) {
return helper ( 1, n );
}
public List<TreeNode> helper ( int start, int end ){
List<TreeNode> res = new ArrayList<TreeNode>();
if ( start > end ){
res.add(null);
return res;
}
if ( start == end ){
TreeNode node = new TreeNode ( start );
res.add( node );
return res;
}
List<TreeNode> left, right;
for ( int i = start; i <= end; i ++ ){
left = helper(start, i - 1);
right = helper ( i + 1, end );
for ( TreeNode lroot : left ){
for ( TreeNode rroot : right ){
TreeNode root = new TreeNode ( i );
root.left = lroot;
root.right = rroot;
res.add( root );
}
}
}
return res;
}
}