Leetcode 95.不同的二叉搜索树II

时间:2019-09-02
本文章向大家介绍Leetcode 95.不同的二叉搜索树II,主要包括Leetcode 95.不同的二叉搜索树II使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题目描述:

    

  给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树。

  示例:

  输入: 3
   输出:
  [
    [1,null,3,2],
    [3,2,null,1],
    [3,1,null,null,2],
    [2,1,3],
    [1,null,2,null,3]
  ]

    上一题(Leetcode94.不同的二叉搜索树)是只用算出能生成的二叉树的个数而并不需要知道具体二叉树长什么样,而这道题是基于上一题的升级版,需要具体的求出不同的二叉树。

算法一:递归

   求出所有树依然要同上一题一样,分别将 1 ~ n 的所有数作为根节点。

   递归这个算法可以直接通过看代码理解具体解题思路,也最好理解,所以直接上代码吧。

public List<TreeNode> generateTrees(int n) {
    List<TreeNode> trees = new ArrayList<TreeNode>();
    if (n == 0) {
        return trees;//没有节点则返回空树
    }
    return getTrees(1, n);
}

private List<TreeNode> getTrees(int start, int end) { 
    List<TreeNode> trees = new ArrayList<TreeNode>();
    if (start > end) {
        trees.add(null);
        return trees;
    }
    //start=end说明只有一个节点,将这个节点作为一棵树加入
    if (start == end) {
        TreeNode tree = new TreeNode(start);
        trees.add(tree);
        return trees;
    }
    //从i=start到end作为根节点
    for (int i = start; i <= end; i++) {
        //得到所有左子树
        List<TreeNode> leftTrees = getTrees(start, i - 1);
         //得到所有右子树
        List<TreeNode> rightTrees = getTrees(i + 1, end);
        //用循环,将不同的左子树与右子树分别相组合
        for (TreeNode leftTree : leftTrees) {
            for (TreeNode rightTree : rightTrees) {
                TreeNode root = new TreeNode(i);
                root.left = leftTree;
root.right
= rightTree;
trees.add(root); } } }
return trees; }

 (^_^后续方法待更新...)

原文地址:https://www.cnblogs.com/Sherlockmmc/p/11449116.html