Givenn, generate all structurally uniqueBST'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
这道题是第96题的延续,生成所有n以内数字组成的二叉搜索树,题目难度为Medium。
根据第96题的经验,每个数字都可以作为根节点,根节点把两边的数字分成两个独立的二叉搜索树,这样可以采用分治法分别处理两边的情况进而得到最终的结果。具体代码:
class Solution {
vector<TreeNode*> genBST(int bgn, int end) {
vector<TreeNode*> ret;
if(bgn>end) return ret;
for(int i=bgn; i<=end; i++) {
vector<TreeNode*> l = genBST(bgn, i-1);
vector<TreeNode*> r = genBST(i+1, end);
int lSz = l.empty() ? 1 : l.size();
int rSz = r.empty() ? 1 : r.size();
for(int j=0; j<lSz; j++) {
for(int k=0; k<rSz; k++) {
TreeNode* root = new TreeNode(i);
if(l.empty()) root->left = NULL;
else root->left = l[j];
if(r.empty()) root->right = NULL;
else root->right = r[k];
root->val = i;
ret.push_back(root);
}
}
}
return ret;
}
public:
vector<TreeNode*> generateTrees(int n) {
return genBST(1, n);
}
};