做完这道题的一些感想
代码如下:
class Solution {
private:
vector<TreeNode*> generateTrees(int first, int last) {
if (first > last) return { NULL };
vector<TreeNode*> v;
for (int i = first; i <= last; ++i) {
auto lefts = generateTrees(first, i - 1);
auto rights = generateTrees(i + 1, last);
for (auto left : lefts) {
for (auto right : rights) {
TreeNode* kk = new TreeNode(i);
kk->left = left;
kk->right = right;
v.push_back(kk);
}
}
}
return v;
}
public:
vector<TreeNode*> generateTrees(int n) {
if (n <= 0) return {};
return generateTrees(1, n);
}
};
所写代码参考了官方题解。
起初对于vector<TreeNode*> v;这条语句的定义位置有些困惑,想了十几分钟终于想通了,记录一下思路以后复习用。
起初我把这个定义放在了递归函数的外面,这是错误的,调用generateTrees()函数是为了生成一个新的更短子序列的二叉搜索树,比如题目要生成1-5的序列,我这样调用,会把{5}、{4,5}这种也加入到答案v中,而答案显然每个集合都要包含1-5这几个数字和若干个NULL。
所以,每次调用generateTrees()函数都要创建一个v.而我们最终返回的是对应于1-5序列的v。
参考网站[参考](https://github.com/azl397985856/leetcode/blob/master/problems/95.unique-binary-search-trees-ii.md)