0%

LeetCode-95

LeetCode-95 不同的二叉搜索树II

题目

结果

代码

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
class Solution {
public List<TreeNode> generateTrees(int n) {
// 特殊情况
if (n == 0) {
return new LinkedList<TreeNode>();
}
return generateTrees(1, n);
}

public List<TreeNode> generateTrees(int begin, int end) {
// 将结果存储在ans中
List<TreeNode> ans = new LinkedList<>();

// 如果长度为0,说明构成不了任何树,返回null
if (begin > end) {
ans.add(null);
return ans;
}

// 所有可能的根节点
for (int i = begin; i <= end; i++) {
var leftTrees = generateTrees(begin, i - 1);
var rightTrees = generateTrees(i + 1, end);

// 所有可能的左右子树
for (var left : leftTrees) {
for (var right : rightTrees) {
TreeNode root = new TreeNode(i);
root.left = left;
root.right = right;
ans.add(root);
}
}
}
return ans;
}
}

@AllArgsConstructor
@NoArgsConstructor
class TreeNode {
int val;
TreeNode left;
TreeNode right;

TreeNode(int val) {
this.val = val;
}
}

递归递归递归。

复杂度

时间和空间复杂度都取决于究竟可以生成多少棵树。

时间复杂度:O(树的数量)

空间复杂度:O(树的数量)