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

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

方法(分治法)

原问题让我们生成由1到n为节点组成的二叉搜索树。那么我们可以用分治法将原问题分解

  • 分解:将原问题分解为以下两个子问题,并递归求解(i为1到n的任意一个节点)
    • 生成由1到i-1为节点组成的二叉搜索树
    • 生成由i+1到n为节点组成的二叉搜索树
  • 合并:令节点i作为根节点,令它的左右子节点分别为由(1…i-1)组成的BST和由(i+1…n)组成的BST
  • 递归结束条件:start > end时,递归结束

代码

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
public List<TreeNode> generateTrees(int n) {
if(n == 0)
return new LinkedList<TreeNode>();
return generate(1, n);
}

public List<TreeNode> generate(int start, int end){
List<TreeNode> res = new LinkedList<>();
if(start > end){
res.add(null);
return res;
}
for(int i = start; i <= end; i++){
List<TreeNode> left = generate(start, i - 1);
List<TreeNode> right = generate(i + 1, end);
for(TreeNode L : left){
for(TreeNode R : right){
TreeNode root = new TreeNode(i);
root.left = L;
root.right = R;
res.add(root);
}
}
}
return res;
}