题目
- 不同的二叉搜索树 II
给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。
涉及的新知识
二叉搜索树关键的性质是根节点的值大于左子树所有节点的值,小于右子树所有节点的值,且左子树和右子树也同样为二叉搜索树。
关于二叉搜索树的一些操作
做法
我对这个“树”的操作很陌生,结果还是看题解的做法与思路。
首先是对[0,n]进行遍历,取其中的一个值 i 分左右,然后再迭代下去。
class Solution {
public:
vector<TreeNode*> generateTrees(int start, int end) {
if (start > end){
return {nullptr};//此处要注意,由于为空的子树是nullptr,此处返回只能是{nullptr},而不能是空的vector
}
vector<TreeNode*> allTrees;
for (int i = start; i <= end; i++) {
vector<TreeNode*> leftTrees = generateTrees(start, i - 1);
vector<TreeNode*> rightTrees = generateTrees(i + 1, end);
for (auto& left :leftTrees){
for (auto& right :rightTrees){
TreeNode* currTree = new TreeNode(i);
currTree->right = right;
currTree->left = left;
allTrees.emplace_back(currTree);
}
}
}
return allTrees;
}
vector<TreeNode*> generateTrees(int n) {
if (!n) {
return {};
}
return generateTrees(1, n);
}
};
其中不明白的点
一个是迭代的逻辑,我接受起来还是慢;
一个是 for(auto& left:leftTree),这里注释是个引用,还不知道;
一个是allTrees.emplace_back(currTree);,这个vector的emplace_back用法我还不知道。