题目
解答:递归
我们知道二叉搜索树的特点:左子树 < 自己 < 右子树
所以如果想找到 1…n 所有的二叉搜索树序列,只需要找以 1…n 中的每一个数作为根节点的左右子树能组成的所有可能即可。
例如:1 … 3 之间的所有二叉搜索树的可能的组成是:
- 以 1 为根节点:左子树为 null,右子树为 2 … 3 组成的全部可能的子树。
- 以 2 为根节点:左子树为 1 形成的子树,右子树是 3 形成的子树。
- 以 3 为根节点:左子树是 1 … 2组成的全部可能的子树,右子树是 null。
简单来说:如果将 i 作为根节点,那么 [1, i) 为 i 的左子树节点,(i, n] 为右子树节点。
那么问题就被拆分为两个子问题了:
- 求左子树的所有可能的组成 。
- 求右子树的所有可能的组成 。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<TreeNode> generateTrees(int n) {
if(n == 0) return new ArrayList<>();
return generate(1, n);
}
private List<TreeNode> generate(int start, int end) {
List<TreeNode> res = new ArrayList<>();
if(start > end) {
res.add(null);
return res;
}
for(int i = start; i <= end; i ++) {
List<TreeNode> lefts = generate(start, i - 1);
List<TreeNode> rights = generate(i + 1, end);
for(TreeNode left : lefts) {
for(TreeNode right : rights) {
TreeNode node = new TreeNode(i);
node.left = left;
node.right = right;
res.add(node);
}
}
}
return res;
}
}