Q:给定一个整数 n,生成所有由 1 ... n 为节点所组成的 二叉搜索树 。
A:递归解决这个问题,分别把每个点作为root,然后把子树连上去。
public List<TreeNode> generateTrees(int n) {
if (n == 0)
return new LinkedList<>();
return generate(1, n);
}
private List<TreeNode> generate(int start, int end) {
List<TreeNode> alltrees = new LinkedList<>();
if (start > end) {
alltrees.add(null);
return alltrees;
}
for (int i = start; i <= end; i++) {//每个点作为根节点
List<TreeNode> leftTree = generate(start, i - 1);//所有可能的左子树集合list
List<TreeNode> rightTree = generate(i + 1, end);//所有可能的右子树集合list
for (TreeNode l : leftTree) {
for (TreeNode r : rightTree) {
TreeNode root = new TreeNode(i);
root.left = l;
root.right = r;
alltrees.add(root);
}
}
}
return alltrees;
}