一、题目概述
二、思路方向
为了生成所有由
n
个节点(值从 1 到n
)组成的不同二叉搜索树(BST),我们可以采用递归的方式。核心思想在于,对于每个数字i
(从 1 到n
),我们可以将其视为根节点,然后递归地生成其左子树(由1
到i-1
的数字组成)和右子树(由i+1
到n
的数字组成)。
三、代码实现
import java.util.ArrayList;
import java.util.List;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
public class Solution {
public List<TreeNode> generateTrees(int n) {
if (n == 0) {
return new ArrayList<>();
}
return generateTrees(1, n);
}
private List<TreeNode> generateTrees(int start, int end) {
List<TreeNode> allTrees = new ArrayList<>();
if (start > end) {
allTrees.add(null); // 空树
return allTrees;
}
for (int i = start; i <= end; i++) {
// 生成所有可能的左子树
List<TreeNode> leftTrees = generateTrees(start, i - 1);
// 生成所有可能的右子树
List<TreeNode> rightTrees = generateTrees(i + 1, end);
// 将当前数字作为根节点,与所有可能的左子树和右子树组合
for (TreeNode left : leftTrees) {
for (TreeNode right : rightTrees) {
TreeNode root = new TreeNode(i);
root.left = left;
root.right = right;
allTrees.add(root);
}
}
}
return allTrees;
}
public static void main(String[] args) {
Solution solution = new Solution();
List<TreeNode> trees = solution.generateTrees(3);
// 打印生成的所有二叉搜索树(这里只是演示如何调用,具体如何打印二叉树结构需要自定义)
// 注意:直接打印 TreeNode 对象不会显示树的结构,需要自定义打印逻辑
}
}
执行结果:
四、小结
注意:上述代码只是生成了所有可能的二叉搜索树,并没有提供打印二叉树结构的代码。打印二叉树结构通常需要递归遍历树,并逐层或按其他方式输出节点值。
此外,上述解决方案的时间复杂度较高,因为它涉及到大量的递归调用和树的生成。对于较大的
n
,生成所有可能的二叉搜索树可能会变得非常耗时和占用大量内存。因此,在处理大规模数据时,需要考虑更高效的算法或优化方法。
结语
祝福你前程广阔,如同星辰大海,无边无际
愿你的梦想之舟,乘风破浪,直抵心中的彼岸
!!!