zoukankan      html  css  js  c++  java
  • [leetcode] Unique Binary Search Trees II

    Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.

    For example,
    Given n = 3, your program should return all 5 unique BST's shown below.

       1         3     3      2      1
               /     /      /       
         3     2     1      1   3      2
        /     /                        
       2     1         2                 3

    https://oj.leetcode.com/problems/unique-binary-search-trees-ii/

    思路:要求所有的树,只能递归枚举了。

    import java.util.ArrayList;
    import java.util.List;
    
    public class Solution {
        public List<TreeNode> generateTrees(int n) {
            return generate(1, n);
        }
    
        private List<TreeNode> generate(int from, int to) {
            List<TreeNode> res = new ArrayList<TreeNode>();
            if (from > to) {
                res.add(null);
                return res;
            }
    
            List<TreeNode> left = new ArrayList<TreeNode>();
            List<TreeNode> right = new ArrayList<TreeNode>();
            for (int i = from; i <= to; i++) {
                left = generate(from, i - 1);
                right = generate(i + 1, to);
    
                for (int j = 0; j < left.size(); j++)
                    for (int k = 0; k < right.size(); k++) {
                        TreeNode tmp = new TreeNode(i);
                        tmp.left = left.get(j);
                        tmp.right = right.get(k);
                        res.add(tmp);
                    }
    
            }
            return res;
    
        }
    
        public static void main(String[] args) {
            System.out.println(new Solution().generateTrees(3).size());
        }
    
    }
    View Code

    第三遍记录:

      递归执行,generate(m,n)返回由m~n节点组成的树的列表,注意做右子树都有null的情况。

      对于一个节点来看,首先先确定顶点,然后顶点的左右子树分别递归生成树集合,然后根据当前顶点,从左右子树中依次挑选一个子树组成新树。

    注意generate在from>to的情况下返回的是一个包含null的List。 然后整个helper方法也需要返回一个List of TreeNode

    import java.util.ArrayList;
    import java.util.List;
    
    public class Solution {
    
        public List<TreeNode> generateTrees(int n) {
            return generate(1, n);
        }
    
        private List<TreeNode> generate(int from, int to) {
            List<TreeNode> res = new ArrayList<TreeNode>();
          //generate empty tree
            if (from > to) {
                res.add(null);
                return res;
            }
        
            List<TreeNode> left = null, right = null;
           /enumerate root: from 'from' to 'to'
            for (int i = from; i <= to; i++) {
                left = generate(from, i - 1);
                right = generate(i + 1, to);
    
                for (int j = 0; j < left.size(); j++) {
                    for (int k = 0; k < right.size(); k++) {
                  
                        TreeNode root = new TreeNode(i);
                        root.left = left.get(j);
                        root.right = right.get(k);
                        res.add(root);
                    }
                }
    
            }
            return res;
    
        }
    
        public static void main(String[] args) {
            List<TreeNode> res = new Solution().generateTrees(3);
            System.out.println(res.size());
        }
    
    }

    参考:

    http://www.cnblogs.com/cheapcrook/archive/2013/01/29/2880903.html

  • 相关阅读:
    Vue 应用 nginx 配置 前后端不分离模式
    解决使用antd Modal组件时数据污染问题
    关于antd怎么在父组件中控制子组件的表单提交
    Web前端工程师面试题1-1
    Web前端工程师面试题7-4
    react 的 生命周期
    字符串的方法
    栈的基本算法
    node.js 获取文件目录
    bat脚本文件启动UG NX软件,动态调用外挂,以及设置环境变量
  • 原文地址:https://www.cnblogs.com/jdflyfly/p/3819345.html
Copyright © 2011-2022 走看看