staticclassSolution{ publicstatic List<TreeNode> generateTrees(int n){ List<TreeNode> res = new LinkedList<>(); if (n == 0) return res; return generateTrees(1, n); } staticprivate List<TreeNode> generateTrees(int start, int end){ //n = 1 的情况,只有一个,就是根节点为1的二叉搜索树 if (start == end) { List<TreeNode> list = new ArrayList<>(); TreeNode node = new TreeNode(start); list.add(node); return list; } //以 i 为根节点,左子树为start~(i-1),右子树为(i+1)~n List<TreeNode> res = new ArrayList<>(); for (int i = start; i <= end; i++) { List<TreeNode> left = new ArrayList<>(); List<TreeNode> right = new ArrayList<>(); if (i != start) { //说明有左子树 left = generateTrees(start, i - 1); } if (i != end) { //说明有右子树 right = generateTrees(i + 1, end); } //先序遍历存入res里面 if (!left.isEmpty() && !right.isEmpty()) { for (TreeNode l : left) { for (TreeNode r : right) { TreeNode root = new TreeNode(i); root.left = l; root.right = r; res.add(root); } } } elseif (!left.isEmpty()) { for (TreeNode l : left) { TreeNode root = new TreeNode(i); root.left = l; res.add(root); } } elseif (!right.isEmpty()) { for (TreeNode r : right) { TreeNode root = new TreeNode(i); root.right = r; res.add(root); } } } return res; }