Unique Binary Search Trees II

来源:互联网 发布:日本女留学生刘鑫 知乎 编辑:程序博客网 时间:2024/04/30 05:06

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.

这个题很惨痛。。一个翻页的Wrong Answer的列表。。。

起初脑残不知道怎么想的。。。思路根本就有问题


最终思路:

递归,给定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==========================

0 0
原创粉丝点击