题目简介:
给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 输入: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
|
提示:
思路:
定义一个函数generateTrees(int left, int right)
,返回在[left, right]
之间所构成的二叉搜索树集合。
首先循环[left, right]
,每个点都能作为根节点,则generateTrees(left, i - 1)
便是该根节点的左子树集合;generateTrees(i + 1, right)
便是该根节点的右子树集合。其中这里的左右子树也为二叉搜索树。
将左右子树都找出来后,遍历循环这两个集合,每次在左子树和右子树集合中选一个作为当前根节点的左右子树并存入res
中。
最后返回res
即可。
tip:
- 当
left > right
时,需要返回的为{nullptr}
或{NULL}
。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
class Solution { public: vector<TreeNode*> generateTrees(int left, int right){
if(left > right) return { nullptr };
vector<TreeNode*> res;
for(int i = left; i <= right; i++){
vector<TreeNode*> left_tree = generateTrees(left, i - 1); vector<TreeNode*> right_tree = generateTrees(i + 1, right);
for(int j = 0; j < left_tree.size(); j++){
for(int k = 0; k < right_tree.size(); k++){
TreeNode* now_root = new TreeNode(i);
now_root -> left = left_tree[j]; now_root -> right = right_tree[k];
res.push_back(now_root); } } }
return res; }
vector<TreeNode*> generateTrees(int n) {
if(n == 0) return {};
return generateTrees(1, n); } };
|