给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树。
示例:
输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] 解释: 以上的输出对应以下 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
思路:
这道题是第一题的升级版,输出满足条件的二叉搜索树,这里用到了第一题的思想,对于输入n,根节点的情况一共由1~n组成(n种情况),则每次让i(1<=i<=n)作根节点,他的左右节点又分别由(1~i-1)和(i+1~n)组成,其中左节点返回(1~i-1)的集合,右节点返回(i+1~n)的集合,遍历左节点集合的每一个节点和右节点集合的每一个节点便组成了i作为节点的情况。
代码如下:
vector<TreeNode*> generateTreesCore(int start, int end) {
vector<TreeNode*> res;
if (end < start) {
res.push_back(nullptr);
return res;
}
if (start == end) {
res.push_back(new TreeNode(start));
return res;
}
if (start < end) {
for (int i = start; i <= end; i++) {
vector<TreeNode*> left = generateTreesCore(start, i - 1);
vector<TreeNode*> right = generateTreesCore(i+1, end);
for (int l = 0; l < left.size(); l++) {
for (int r = 0; r < right.size(); r++) {
TreeNode* node = new TreeNode(i);
node->left = left[l];
node->right = right[r];
res.push_back(node);
}
}
}
}
return res;
}
vector<TreeNode*> generateTrees(int n) {
vector<TreeNode*> res;
if(n<=0){
return res;
}
return generateTreesCore(1, n);
}