题目描述
给定一个整数 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
C++
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
/*
思路,对于[1,n],以m为根节点的树。左子树是[1,m-1]可构成的子树,右子树是[m+1,n]可构成的子树
递归
递归停止过条件:左边界大于有边界
返回什么:所有可能树的根节点列表
本级干什么:申请新节点,生成左子树可能列表。生成右子树可能列表,左右子树拼接。
*/
class Solution {
public:
vector<TreeNode*> generateTrees(int n) {
vector<TreeNode*> res;
if(n) return recu(1,n);
res.push_back(nullptr);
return res;
}
vector<TreeNode*> recu(int l,int r){
vector<TreeNode*> res;
if(l>r) {
res.push_back(nullptr);
return res;
}
for(int i=l;i<=r;i++)
{
vector<TreeNode*> left=recu(l,i-1);
vector<TreeNode*> right=recu(i+1,r);
for(TreeNode * m:left)
for(TreeNode * n:right)
{ TreeNode* root=new TreeNode(i);
root->left=m;
root->right=n;
res.push_back(root);
}
}
return res;
}
};
相近题目:96.不同的二叉搜索树