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
一开始想用dp[i j] 记录i 到j 的所有树,但是每次执行到dp[i j]时必须深拷贝,因为每一个节点都有可能作为root,只考拷贝root的指针的话很可能会形成环,破坏其他数的结构。
二每一场深拷贝有要遍历子树的每一个节点,其复杂度与直接递归一样,还占空间,增加代码量,所以最后直接递归生成子树即可!
[i j]的子树为 ,以所有k为根, [i k- 1] 与[ k + 1 , j]为左右子树的组合!
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) {
return tree(1,n);
}
vector<TreeNode *> tree(int start, int end)
{
//root 从start 到end扫描,当r == end时 右子树为 (end + 1, end)
if(end < start)
{
//1.每次都确保会返回vector 则下面的for循环永远都能正确执行
vector<TreeNode *> rst;
rst.push_back(NULL);
return rst;
}
//最后rst一定不会为 空,因为注释1.有保证
vector<TreeNode *>rst;
//扫描所有 值做为root
for(int r = start; r <= end; r++)
{
vector<TreeNode *> lv = tree(start, r - 1);
vector<TreeNode *> rv = tree(r + 1, end);
for(int l = 0; l < lv.size(); l++)
{
for(int rt = 0; rt < rv.size(); rt++)
{
TreeNode *root = new TreeNode(r);
root->left = lv[l];
root->right = rv[rt];
rst.push_back(root);
}
}
}
return rst;
}
};