给定一个整数 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
思路和96. 不同的二叉搜索树差不多,但是这道题需要把具体的二叉树写出来。当给定一个整数n的时候,我们可以以1, 2, 3,... n分别为根节点。当以k为根节点的时候,它左面有k-1个元素,右面有n-k个元素,组成的二叉树共有C(k-1)*C(n-k)种。对于C(k-1),可以以这k-1个数分别为根节点组成二叉树,对于C(n-k),可以以这n-k个数分别为根节点组成二叉树,递归解决。注意n=0时候的边界。
class Solution {
public:
vector<TreeNode*> help(int start, int end){
vector<TreeNode*> re;
if(start>end)
return {nullptr};
for(int i=start; i<=end; ++i){
vector<TreeNode*> left=help(start, i-1);
vector<TreeNode*> right=help(i+1, end);
for(int p=0; p<left.size(); ++p){
for(int q=0; q<right.size(); ++q){
TreeNode* root=new TreeNode(i);
root->left=left[p];
root->right=right[q];
re.push_back(root);
}
}
}
return re;
}
vector<TreeNode*> generateTrees(int n) {
if(n==0) return {};
return help(1, n);
}
};