![]()
- res是什么?是树的根节点集合。
- 为什么res可以写在递归函数里,而不是声明为全局变量?res存的是每一层的结果,每一层的结果最后会return给上层节点,所以res其实相当于临时变量。
- 为什么递归可以算出结果?对根节点从1到n循环:循环内部递归算出根节点左右两边子树的二叉搜索树,再把这个结果排列组合接在根节点的左右两边。
- 一定要明白递归函数的定义:算出所有不同的二叉搜索树,即题目要求。相信递归可以做到这件事情,只要把当前节点该做的事做好就行。
class Solution {
public List<TreeNode> generateTrees(int n) {
if(n==0) return new LinkedList<>();
return bulid(1,n);
}
public List<TreeNode> bulid(int lo,int hi){
LinkedList<TreeNode> res=new LinkedList<>();
if(lo>hi){
res.add(null);
return res;
}
for(int i=lo;i<=hi;i++){
List<TreeNode> leftTree=bulid(lo,i-1);
List<TreeNode> rightTree=bulid(i+1,hi);
for(TreeNode left:leftTree){
for(TreeNode right:rightTree){
TreeNode root=new TreeNode(i);
root.left=left;
root.right=right;
res.add(root);
}
}
}
return res;
}
}