二叉搜索树满足的条件
- 当前根节点的值大于左子树节点的值
- 当前根节点的值小于右子树节点的值
- 左右子树同样是二叉搜索树
根据上述规则可以看出,根节点值不同,形成的二叉搜索树就不同,那么[1:n]范围内的n个数就有n个不同的选择。
[1:i−1]这i-1个数在其左子树上,[i+1:n]这n-i个数在其右子树上。
通过[1:i−1]这i-1个数可以构成多个不同的二叉搜索树,假设是leftTree1,leftTree2,….,leftTreeL;
通过[i+1:n]这n-i个数可以构成多个不同的二叉搜索树,假设是rightTree1,rightTree2,…,rightTreeR;
那么可知以i作为根节点的二叉搜索树共有L∗R个,另这些树依次组成即可求出这L∗R个树。
构造好之后作为当前树的结果返回
代码:
lass Solution {
public:
vector<TreeNode *> generateTrees(int n) {
return CreateTree(1,n);
}
vector<TreeNode*> CreateTree(int start, int end)
{
vector<TreeNode*> res;
if(start>end)
{
res.push_back(NULL);
return res;
}
//以i作为分界点获取左右两部分的子树集合
for(int i=start;i<= end;++i)
{
vector<TreeNode*> left=CreateTree(start,i-1);
vector<TreeNode*> right=CreateTree(i+1,end);
for(TreeNode* left:left)
{
for(TreeNode* right:right)
{
//构建以i为值的根节点,添加左右子树,添加到结果中
TreeNode* root=new TreeNode(i); //i作为根
root->left=left;
root->right=right;
res.emplace_back(root);
}
}
}
return res;
}
};