[Leetcode] Unique Binary Search Trees II

来源:互联网 发布:mysql from 多表 编辑:程序博客网 时间:2024/06/07 08:48

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.


/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    //[start,end]    vector<TreeNode*>createTreeSub(int start,int end){            if(start >= end)return vector<TreeNode*>(1,NULL);            vector<TreeNode*>result,left,right;                for(int i = start;i < end;i++){                    left = createTreeSub(start,i);                    right = createTreeSub(i+1,end);                    for(int l = 0;l < left.size();l++)                        for(int r = 0;r < right.size();r++){                            TreeNode* root = new TreeNode(i);                            root->left = left[l];                            root->right = right[r];                            result.push_back(root);                        }                }                return result;               }    vector<TreeNode*> generateTrees(int n) {             return createTreeSub(1,n+1);    }};

class Solution {public:    /*        use heap to avoid vector object ctor and dtor    */    //[start,end]    vector<TreeNode*>*createTreeSub(int start,int end){            vector<TreeNode*>*result,*left,*right;            result = new vector<TreeNode*>();            if(start >= end)result->push_back(NULL);            for(int i = start;i < end;i++){                    left = createTreeSub(start,i);                    right = createTreeSub(i+1,end);                    for(int l = 0;l < left->size();l++)                        for(int r = 0;r < right->size();r++){                            TreeNode* root = new TreeNode(i);                            root->left = left->at(l);                            root->right = right->at(r);                            result->push_back(root);                        }                }                return result;               }    vector<TreeNode*> generateTrees(int n) {             return *createTreeSub(1,n+1);    }};




0 0
原创粉丝点击