原题
难度中等800
给定一个整数 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
提示:
0 <= n <= 8
题解:选一个元素作为根 左边右边 分别产生左子树序列 右子树序列一定满足 二叉搜索树(太妙了!!!)
class Solution {
public:
vector<TreeNode*> help(int index, int n){
if(index>n) return { nullptr };
vector<TreeNode*> rs;
for(int i = index; i <= n; i++){
//选取某个节点作为根,其余节点,从i的左边右边产生;
vector<TreeNode*> leftTree = help(index, i-1);
vector<TreeNode*> rightTree = help(i+1, n);
for(TreeNode* left : leftTree){
for(TreeNode* right : rightTree){
TreeNode* node = new TreeNode(i, left, right);
rs.push_back(node);
}
}
}
return rs;
}
vector<TreeNode*> generateTrees(int n) {
return help(1, n);
}
};