Unique Binary Search Trees II
Unique Binary Search Trees II
Given N, generate all BST sequences with nodes 1 to N.
Each value can be the root. Use recursion and divide-and-conquer. Let elements on the left form the left subtree and elements on the right form the right subtree. This reduces the problem size.
class Solution {
public:
vector<TreeNode*> generateTrees(int n) {
if (n==0) return vector<TreeNode*>();
return genTree(1, n);
}
vector<TreeNode*> genTree(int start, int end) {
// all generated trees from start to end
vector<TreeNode*> tree_list;
if (start>end) tree_list.push_back(NULL);
for(int i=start;i<=end;++i) {
// each can be root
// recursively generate left subtree
vector<TreeNode*> left = genTree(start, i-1);
// recursively generate right subtree
vector<TreeNode*> right = genTree(i+1, end);
// combine left and right subtrees with i as root
for(auto lnode : left) {
for(auto rnode : right) {
TreeNode* root = new TreeNode(i);
root->left = lnode;
root->right = rnode;
// add to result and return
tree_list.push_back(root);
}
}
}
return tree_list;
}
};#recursion #divide-and-conquer #BST #tree