题意:生成所有可能的二叉搜索树。
一开始没思路。
这里将元素划分为左右两部分,每部分求出所有可能的子树。根节点只要枚举左右子树的所有可能组合情况,并生成相应的根节点,返回这样的根节点即可。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<TreeNode*> build(int st,int ed){
vector<TreeNode*>res;
if(st>ed){
res.push_back(NULL);
return res;
}
for(int i=st;i<=ed;++i){
vector<TreeNode*>l=build(st,i-1);
vector<TreeNode*>r=build(i+1,ed);
for(int j=0;j<l.size();++j){
for(int k=0;k<r.size();++k){
TreeNode* root=new TreeNode(i);
root->left=l[j];
root->right=r[k];
res.push_back(root);
}
}
}
return res;
}
vector<TreeNode *> generateTrees(int n) {
return build(1,n);
}
};