95. 不同的二叉搜索树 II

 用递归即可

因为是二叉搜索树,也就是根大于左子节点,根小于右子节点,这就好办了,对于每个可能的根节点,求出所有左右子树的集合,双循环配对

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<TreeNode> generateTrees(int n) {
         List<TreeNode> ans = new ArrayList<TreeNode>();
        if (n == 0) {
            return ans;
        }
        int start=1;
        int end=n;
        return getans(start,end);
    }
     public List<TreeNode> getans(int start,int end)//显然,结果里,只需要放二叉树的根就好
     {
          List<TreeNode> ans = new ArrayList<TreeNode>();//结果
          if(start>end)//没有点,返回null
          {
              ans.add(null);
              return ans;
          }
          if(start==end)//只有一个点,返回这个点为根节点的树就好
          {
            TreeNode T=new TreeNode(start);
            ans.add(T);
            return ans;
          }
          for(int i=start;i<=end;i++)//i是可能的根,所有循环,找的是所有的根
          {
              List<TreeNode> lefts=getans(start,i-1);//对于每个根,找所有可能的左右子树
              List<TreeNode> rights=getans(i+1,end);
        for (TreeNode leftTree : lefts) //双层循环,把以i为节点的,左子树,右子树结合为二叉搜索树,加到ans里面
            for (TreeNode rightTree : rights)
            {
                TreeNode root=new TreeNode(i);//当前节点作为根节点
                root.left=leftTree;
                root.right=rightTree;
                ans.add(root);//结果集合里面加上一个结果
            }
        }
        return  ans;
          }

     }

  

原文地址:https://www.cnblogs.com/lzh1043060917/p/12829596.html