1、题目描述
输入n,返回所有由节点值为1~n的n个节点形成的BST。
2、思路
递归。每个节点都去当一下根节点,再算出左右子树的所有可能性。进行结合。
3、代码
vector<TreeNode*> generateTrees(int n){
vector<TreeNode*> ans;
if(n==0) return ans;
return generateTrees1(1,n);
}
vector<TreeNode*> generateTrees1(int start,int end) {
vector<TreeNode*> ans;
if(start>end){
ans.push_back(NULL);
return ans;
}
for(int i=start;i<=end;i++){
vector<TreeNode*> v1 = generateTrees1(start,i-1);
vector<TreeNode*> v2 = generateTrees1(i+1,end);
for(int j=0;j<v1.size();j++){
for(int k=0;k<v2.size();k++){
TreeNode* root = new TreeNode(i);
root->left = v1[j];
root->right = v2[k];
ans.push_back(root);
}
}
}
return ans;
}