for (int i = left; i <= right; i++) { // 递归调用求解左右子树 List<TreeNode> leftTreeRoot = generateTrees(left, i - 1); List<TreeNode> rightTreeRoot = generateTrees(i + 1, right); for (int m = 0; m < leftTreeRoot.size(); m++) { for (int n = 0; n < rightTreeRoot.size(); n++) { TreeNode root = new TreeNode(i, leftTreeRoot.get(m), rightTreeRoot.get(n)); list.add(root); } } }
该函数终止的条件就是 left > right 或者 left == right,需要注意的是,当 left > right 时,我们返回了一个包含 null 的 List,这是因为要保证返回的 List 的长度不为能 0,否则在使用 for 循环遍历时,无法组合两个子树
// 如果左子树或右子树的长度为 0,将会导致循环立即退出,无法进行组合 for (int m = 0; m < leftTreeRoot.size(); m++) { for (int n = 0; n < rightTreeRoot.size(); n++) { TreeNode root = new TreeNode(i, leftTreeRoot.get(m), rightTreeRoot.get(n)); list.add(root); } }
例如左子树长度为 0,但是右子树长度不为 0,此时是能够形成二叉树的,但是因为左子树长度为 0,导致 for 循环立即退出,无法进行组合形成二叉树,所以我们要保证返回的 List 长度不能为 0,我们添加一个 null 进行组合。