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把递归放进循环里面的思想——这样就可以抽离根节点和左右子树节点
总结一点,要求出所有组合的问题,一般用dfs;如果要求总数,用dp。
另外,这道题的思路就是对1..n中的每一个数都依次让它做root,然后分出左右区间,再递归求解。最后把左右区间求得的子结果依次分别作为root的左右孩子,因此总共要3次循环。
还有值得注意的技巧是,当begin>end时,要往ret AL里面添加null,使得每个AL里面至少有一个元素(null)。这样可以避免判断只有左区间或只有右区间的情况。
class Solution {
public:
vector<TreeNode *> generateTrees(int n) {
return dfs(1,n);
}
vector<TreeNode*> dfs(int left,int right) {
if(left>right) {
vector<TreeNode*> res;
res.push_back(nullptr);
return res;
}
//return vector<TreeNode*>(1,nullptr);
vector<TreeNode*> res;
for(int k=left;k<=right;k++) {
vector<TreeNode*> leftTree = dfs(left,k-1);
vector<TreeNode*> rightTree = dfs(k+1,right);
for(int i=0;i<leftTree.size();i++) {
for(int j=0;j<rightTree.size();j++) {
TreeNode* root = new TreeNode(k);
root->left = leftTree[i];
root->right = rightTree[j];
res.push_back(root);
}
}
}
return res;
}
};