给定一个整数 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

答案:

 1public List<TreeNode> generateTrees1(int n) {
2    if (n == 0) return new ArrayList<>();
3    return genTreeList(1, n);
4}
5
6private List<TreeNode> genTreeList(int start, int end) {
7    List<TreeNode> list = new ArrayList<TreeNode>();
8    if (start > end) {
9        list.add(null);
10    }
11    for (int idx = start; idx <= end; idx++) {
12        List<TreeNode> leftList = genTreeList(start, idx - 1);
13        List<TreeNode> rightList = genTreeList(idx + 1end);
14        for (TreeNode left : leftList) {
15            for (TreeNode right : rightList) {
16                TreeNode root = new TreeNode(idx);
17                root.left = left;
18                root.right = right;
19                list.add(root);
20            }
21        }
22    }
23    return list;
24}

解析:

这种解法其实很好理解,他会在n个数中先找到一个数m(1<=m<=n)作为当前节点,然后m前面的数(这里是没有的)作为他的左子树进行递归构建,后面的数作为他的右子树进行递归构建,下面再来看最后一种解法

 1public static List<TreeNode> generateTrees(int n) {
2    List<TreeNode>[] result = new List[n + 1];
3    result[0] = new ArrayList<>();
4    if (n == 0) {
5        return result[0];
6    }
7    result[0].add(null);
8    for (int len = 1len <= n; len++) {
9        result[len] = new ArrayList<>();
10        for (int j = 0; j < len; j++) {
11            for (TreeNode nodeL : result[j]) {
12                for (TreeNode nodeR : result[len - j - 1]) {
13                    TreeNode node = new TreeNode(j + 1);
14                    node.left = nodeL;
15                    node.right = clone(nodeR, j + 1);
16                    result[len].add(node);
17                }
18            }
19        }
20    }
21    return result[n];
22}
23
24private static TreeNode clone(TreeNode n, int offset) {
25    if (n == null) {
26        return null;
27    }
28    TreeNode node = new TreeNode(n.val + offset);
29    node.left = clone(n.left, offset);
30    node.right = clone(n.right, offset);
31    return node;
32}