zoukankan      html  css  js  c++  java
  • 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; }

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

  • 相关阅读:
    AdaBoost
    svm算法
    DBSCAN算法
    聚类算法分类
    EM算法
    ios开发中使用FMDB
    eclipse配置mahout
    【MyBatis】Mapper XML 文件
    MyBatis Generator的使用
    IntelliJ IDEA 创建 Maven简单项目
  • 原文地址:https://www.cnblogs.com/Sherlockmmc/p/11449116.html
Copyright © 2011-2022 走看看