给定一个整数 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个数字,选取任意一个数字,便可以得到它的左子树与右子树各自包含的数字,于是可以递归调用函数,分别构建左右子树,之后进行拼接。
class Solution {
public:
vector<TreeNode*> generateTrees(int n) {
if(n<1) return {};
return gt(1,n);
}
vector<TreeNode*> gt(int n,int m){
if(n>m) return {nullptr};
vector<TreeNode*> res;
for(int i=n;i<=m;++i){
auto left = gt(n,i-1);
auto right = gt(i+1,m);
for(auto l:left){
for(auto r:right){
TreeNode* cur = new TreeNode(i);
cur->left = l;
cur->right = r;
res.push_back(cur);
}
}
}
return res;
}
};