题目链接
思路:
题目要求构建节点值从1~n的所有的二叉搜索树,那么就必须要确保任何一棵子树的左子树 < 根 < 右子树
从1~n中,对于任意一个值,比如2来说,1只能作为它的左子树,从3开始到n都是2的右子树,但是右子树怎么排布就变成了和2挑选左子树右子树同样的问题,通过递归解决就好
public List<TreeNode> generateTrees(int n) {
if (n == 0) {
return new LinkedList<>();
}
return generateTrees(1, n);
}
private List<TreeNode> generateTrees(int start, int end) {
List<TreeNode> ans = new LinkedList<>();
if (start > end) {
ans.add(null);
return ans;
}
for (int i = start; i <= end; i++) {
// 以i为根节点,产生所有的左子树
List<TreeNode> subLeftTree = generateTrees(start, i - 1);
// 以i为根节点,产生所有的右子树
List<TreeNode> subRightTree = generateTrees(i + 1, end);
// 将左子树和右子树的所有可能跟i进行连接
for (TreeNode left : subLeftTree) {
for (TreeNode right : subRightTree) {
TreeNode node = new TreeNode(i);
node.left = left;
node.right = right;
ans.add(node);
}
}
}
return ans;
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
代码参考自:https://leetcode-cn.com/problems/unique-binary-search-trees-ii/comments/5409