Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.
For example,
Given n = 3, your program should return all 5 unique BST's shown below.
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
起初脑残不知道怎么想的。。。思路根本就有问题
最终思路:
递归,给定n,分别以从1到n为根,然后枚举出左子树(m个)和右子树(n个),然后合并成一棵树(m*n个)
注意,在将树保存到vector的时候,需要注意,根不要重用,这样会修改掉vector中前面的树的信息,根要每次都new出来。
/**
* 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 *> generateTrees(int n) {
vector<TreeNode*> vv;
if(n<1){
vv.push_back(NULL);
return vv;
}
return build(1,n);
}
vector<TreeNode*> build(int start,int end){
vector<TreeNode*> vv;
if(start>end){
return vv;
}else if(start==end){
vv.push_back(new TreeNode(start));
}else{
for(int i=start;i<=end;i++){
TreeNode* node = new TreeNode(i);
vector<TreeNode*> vl = build(start,i-1);
vector<TreeNode*> vr = build(i+1,end);
if(vl.size()==0){
for(int j=0;j<vr.size();j++){
node = new TreeNode(i);
node->right = vr[j];
vv.push_back(node);
}
}else if(vr.size()==0){
for(int j=0;j<vl.size();j++){
node = new TreeNode(i);
node->left = vl[j];
vv.push_back(node);
}
}else{
for(int j=0;j<vl.size();j++){
for(int k=0;k<vr.size();k++){
node = new TreeNode(i);
node->left = vl[j];
node->right = vr[k];
vv.push_back(node);
}
}
}
}
}
return vv;
}
};
==========================================updated on 1st, April, 2014====================
/**
* 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 *> generateTrees(int n) {
vector<TreeNode*> v;
v = build(1,n);
return v;
}
vector<TreeNode*> build(int start,int end){
vector<TreeNode*> v;
if(start>end){
v.push_back(NULL);
return v;
}
if(start==end){
TreeNode* node = new TreeNode(start);
v.push_back(node);
return v;
}
vector<TreeNode*> left,right;
for(int i=start;i<=end;i++){
left = build(start,i-1);
right = build(i+1,end);
for(int j = 0;j<left.size();j++){
for(int k=0;k<right.size();k++){
TreeNode* node = new TreeNode(i);
node->left = left[j];
node->right = right[k];
v.push_back(node);
}
}
}
return v;
}
};
==========================================updated on 1st, April, 2014====================
==========================================updated on 4th, Sep, 2014==========================
class Solution {
public:
vector<TreeNode *> generateTrees(int n) {
return dfs(1,n);
}
vector<TreeNode*> dfs(int start,int end){
vector<TreeNode*> v;
if(start>end){
v.push_back(NULL);
return v;
}
for(int i=start;i<=end;i++){
vector<TreeNode*> left = dfs(start,i-1);
vector<TreeNode*> right = dfs(i+1,end);
for(int j=0;j<left.size();j++){
for(int k=0;k<right.size();k++){
TreeNode* node = new TreeNode(i);
node->left = left[j];
node->right = right[k];
v.push_back(node);
}
}
}
return v;
}
};
==========================================updated on 4th, Sep, 2014==========================