题目链接
思路:递归
分析:不同的二叉搜索树,那么我们可以枚举每个数当作节点去深搜,也就是说,题目要求我们从[1,n]中挑选数进行二叉树的建立,那么我们首先,可以以1为根节点,然后进行深搜,下一层也就是[2,n]挑选数进行二叉树的建立,并且下一层肯定是1的右子树,因为二叉搜索树的性质决定。
那么我们可以枚举,分别以1为根节点,2为根节点,3为根节点。。。。一直到以n为根节点。
[1,n],我们以i为根节点,那么[1,i-1]也就是i的左子树,[i+1,n]肯定是i的右子树,那么问题就变成了初始问题的小问题,然后我们将[1,i-1],[i+1,n]得到的左右子树进行拼接就是答案。
这个深搜的出口是[start, end],start>end,那么就是说是空树。
代码:
class Solution {
public List<TreeNode> generateTrees(int n) {
return dfs(1,n);
}
//得到[start,end]形成的不同的二叉搜索树
public List<TreeNode> dfs(int start, int end){
//收集所有的根节点
List<TreeNode> allNode = new LinkedList<>();
//深搜的出口
if(start > end){
allNode.add(null);
return allNode;
}
//枚举根节点
for(int i = start; i <= end; i++){
//左子树的二叉树的各个根节点
List<TreeNode> lson = dfs(start, i-1);
//右子树的二叉树的各个根节点
List<TreeNode> rson = dfs(i+1, end);
//将左右子树拼到当前根节点上
for(TreeNode left : lson){
for(TreeNode right : rson){
//new 根节点
TreeNode curRoot = new TreeNode(i);
curRoot.left = left;
curRoot.right = right;
allNode.add(curRoot);
}
}
}
return allNode;
}
}