题意:给定一个数字n,求出所有的BST,使它们中序遍历的结果是1到n
思路:用递归法构造。对1到n里的每个数字,分别以它为根,由左边的数字构造左子树,由右边的数字构造右子树。然后将所有的情况组合起来,
就可以得到所有的BST。
代码: vector<TreeNode *> generateTrees(int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<TreeNode *> result;
if (n==0)
{
result.push_back(NULL);
return result;
}
if (n==1)
{
result.push_back(new TreeNode(1));
return result;
}
for (int i=1;i<=n;i++)
{
vector<TreeNode *> leftTrees=generateTrees(1,i-1);
vector<TreeNode *> rightTrees=generateTrees(i+1,n-i);
for (int j=0;j<leftTrees.size();j++)
for (int k=0;k<rightTrees.size();k++)
{
TreeNode * tree=new TreeNode(i);
tree->left=leftTrees[j];
tree->right=rightTrees[k];
result.push_back(tree);
}
}
return result;
}
vector<TreeNode *> generateTrees(int start,int len)
{
vector<TreeNode *> result;
if (len==0)
{
result.push_back(NULL);
return result;
}
for (int i=start;i<start+len;i++)
{
vector<TreeNode *> leftTrees=generateTrees(start,i-start);
vector<TreeNode *> rightTrees=generateTrees(i+1,len+start-i-1);
for (int j=0;j<leftTrees.size();j++)
for (int k=0;k<rightTrees.size();k++)
{
TreeNode * tree=new TreeNode(i);
tree->left=leftTrees[j];
tree->right=rightTrees[k];
result.push_back(tree);
}
}
return result;
}