164 · 不同的二叉查找树 II
方法1:DFS
- 按 [ s t a r t . . . r o o t − 1 ] [start...root-1] [start...root−1] 与 [ r o o t + 1... e n d ] [root+1...end] [root+1...end]递归建树
思路
递归的步骤:
1、递归出口,如果start值大于end值,返回一个只含空节点的列表。
2、枚举根节点的值root_val,从start到end。
3、递归获得所有可能的左子树[start, root_val - 1]。
4、递归获得所有可能的右子树[root_val + 1, end]。
5、遍历左右子树的所有可能,组合成新的树,加入结果数组result中。
6、返回结果数组result。
public List<TreeNode> generateTrees(int n) {
return helper(1, n);
}
private List<TreeNode> helper(int start, int end) {
List<TreeNode> res = new ArrayList<>();
if (start > end) {
res.add(null);
return res;
}
for (int k = start; k <= end; k++) {
List<TreeNode> left = helper(start, k - 1);
List<TreeNode> right = helper(k + 1, end);
for (int i = 0; i < left.size(); i++) {
TreeNode l = left.get(i);
for (int j = 0; j < right.size(); j++) {
TreeNode r = right.get(j);
TreeNode root = new TreeNode(k);
root.left = l;
root.right = r;
res.add(root);
}
}
}
return res;
}