Leetcode 95. 不同的二叉搜索树 II
题目
给定一个整数 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
题解
递归构造
二叉搜索树的特点是左子树的节点值都小于根节点,右子树的节点值都大于根节点。我们可以用递归构造。遍历每个节点充当根节点,小于它的值递归构造成左子树,大于它的值递归构造成右子树。详细过程见代码
代码
vector<TreeNode*> helper(int begin,int end){
vector<TreeNode*> ret;
if(begin > end) ret.push_back(nullptr);
for(int i=begin; i<=end; i++){
vector<TreeNode*> left = helper(begin,i-1); //构造左子树
vector<TreeNode*> right = helper(i+1,end); //构造右子树
for(auto& l:left){ //左右子树进行组合
for(auto& r:right){
TreeNode * root = new TreeNode(i);
root->left = l;
root->right = r;
ret.push_back(root);
}
}
}
return ret;
}
vector<TreeNode*> generateTrees(int n) {
if(n == 0) return {};
return helper(1,n);
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。