题目:
给你一个整数 n
,请你生成并返回所有由 n
个节点组成且节点值从 1
到 n
互不相同的不同 二叉搜索树 **。可以按 任意顺序 返回答案。
思路: 看到树题目,就想递归因为这样简单点
当选择 i 为根节点,那么左子树都比 i小,右子树都比i大。然后拼接左右子树即可。
class Solution {
public List<TreeNode> generateTrees(int n) {
if (n == 0) {
return new ArrayList<>();
}
return generateTrees(1, n);
}
public List<TreeNode> generateTrees(int s, int e) {
List<TreeNode> ans = new ArrayList<>();
if (s > e) {
ans.add(null);
return ans;
}
for(int i = s; i <= e; i++){
List<TreeNode> l = generateTrees(s,i - 1);//以i 作为根节点,那么左子树都比i小
List<TreeNode> r = generateTrees(i + 1,e);//以i 作为根节点,那么右子树都比i大
for(TreeNode lTree : l ){
for(TreeNode rTreee : r){
TreeNode cur = new TreeNode(i);//选择当前i作为根节点
cur.left = lTree;//选择左子树
cur.right = rTreee;//选择右子树
ans.add(cur);
}
}
}
return ans;
}
}