Leetcode-95.不同的二叉搜索树II

题目链接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii/

解法1:递归

二叉搜索树的性质:左子树所有节点小于根节点,右子树所有节点大于根节点。

所有我们选择好根节点,将剩余节点分到左右子树,然后再分别对左右子树进行选择根节点,分好左右子树。直到如果只有一个数字,那么就只有这一种情况,把这一节点作为一棵树返回,如果没有数字,则直接返回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
53
54
55
56
57
58
59
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
vector<TreeNode*> res;
public:
vector<TreeNode*> generateTrees(int n) {
vector<TreeNode*> res;
if(n==0)
return res;
return getres(1,n);
}
vector<TreeNode*> getres(int start,int end)
{
vector<TreeNode*> res;
//此时没有数字,将 null 加入结果中
if(start>end)
{
res.push_back(NULL);
return res;
}
//只有一个数字,当前数字作为一棵树加入结果中
if(start==end)
{
TreeNode *tree=new TreeNode(start);
res.push_back(tree);
return res;
}
int i;
//尝试每个数字作为根节点
for(i=start;i<=end;i++)
{
//得到所有可能的左子树
vector<TreeNode*> leftTrees=getres(start,i-1);
//得到所有可能的右子树
vector<TreeNode*> rightTrees=getres(i+1,end);
//左子树右子树两两组合
for(TreeNode *leftTree:leftTrees)
{
for(TreeNode *rightTree:rightTrees)
{
TreeNode *root=new TreeNode(i);
root->left=leftTree;
root->right=rightTree;
//加入到最终结果中
res.push_back(root);
}
}
}
return res;
}
};