public IList<TreeNode> GenerateTrees(int n)
{
return n == 0 ? new List<TreeNode>() : GenerateTrees(1, n);
}
public IList<TreeNode> GenerateTrees(int start, int end)
{
IList<TreeNode> trees = new List<TreeNode>();
if (start > end)
{
trees.Add(null);
}
else
{
for (int rootVal = start; rootVal <= end; rootVal++)
{
IList<TreeNode> leftSubtrees = GenerateTrees(start, rootVal - 1);
IList<TreeNode> rightSubtrees = GenerateTrees(rootVal + 1, end);
foreach (TreeNode leftSubtree in leftSubtrees)
{
foreach (TreeNode rightSubtree in rightSubtrees)
{
TreeNode root = new TreeNode(rootVal);
root.left = leftSubtree;
root.right = rightSubtree;
trees.Add(root);
}
}
}
}
return trees;
}