vector<TreeNode *> generateTrees(int n) //Unique Binary Search Trees II
{
if (n == 0) return generate(1, 0);
return generate(1, n);
}
vector<TreeNode *> generate(int start, int end)
{
vector<TreeNode*> subTree;
if (start > end) {
subTree.push_back(nullptr);
return subTree;
}
for (int k = start; k <= end; k++)
{
vector<TreeNode*> leftSubs = generate(start, k - 1);
vector<TreeNode*> rightSubs = generate(k + 1, end);
for (auto i=0;i<leftSubs.size();i++) {
for (auto j=0;j< rightSubs.size();j++) {
TreeNode *node = new TreeNode(k);
node->left = leftSubs[i];
node->right =rightSubs[j];
subTree.push_back(node);
}
}
}
return subTree;
}