95. 不同的二叉搜索树 II

题意

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

解题思路

这道题目是基于不同的二叉搜索树进行改进的;

对于连续整数序列[left, right]中的一点 i,若要生成以 i 为跟结点的BST,则有如下的规律:

  • i 左边的序列可以作为左子树结点,并且左儿子可能有多个,因此存在left_nodes = self.helper(left, i-1)

  • i 右边的序列可以作为右子树结点,并且右儿子可能有多个,因此存在right_nodes = self.helper(i+1, right)

  • 产生的以当前结点 i 为跟结点的BST树有len(left_nodes) * len(right_nodes)个,遍历每一种情况,即可以产生以 i 为跟结点的BST序列,因此以 for 循环使得[left, right]中每个结点都能生成子树序列;

一旦left大于right,则说明这里无法产生子树,所以此处应该是作为空结点返回;

实现

class Solution(object):
   def generateTrees(self, n):
       """
      :type n: int
      :rtype: List[TreeNode]
      """
       if n <= 0:
           return []

       return self.helper(1, n)

   def helper(self, left, right):
       result = []
       # 一旦left大于right,则说明这里无法产生子树,所以此处应该是作为空结点返回
       if left > right:
           result.append(None)
           return result

       for i in range(left, right+1):
           left_nodes = self.helper(left, i-1)
           right_nodes = self.helper(i+1, right)
           # 包括产生的以当前结点 i 为跟结点的BST树有len(left_nodes) * len(right_nodes)个,因此双层遍历
           for left_node in left_nodes:
               for right_node in right_nodes:
                   node = TreeNode(i)
                   node.left = left_node
                   node.right = right_node
                   result.append(node)

       return result
     
def generateTrees(self, n):
       """
      :type n: int
      :rtype: List[TreeNode]
      """
       if n <= 0:
           return []
       
       # 使用left,right表示左右两边结点对应个数的个数
       result = defaultdict(list)
       
       def helper(left, right):
           if left > right:
               return [None]
           # 避免重复执行
           if (left, right) in result:
               return result[(left, right)]
           
           for i in range(left, right+1):
               left_nodes = helper(left, i-1)
               right_nodes = helper(i+1, right)
               # 包括产生的以当前结点 i 为跟结点的BST树有len(left_nodes) * len(right_nodes)个,因此双层遍历
               for left_node in left_nodes:
                   for right_node in right_nodes:
                       node = TreeNode(i)
                       node.left = left_node
                       node.right = right_node
                       result[(left, right)].append(node)
           return result[(left, right)]
           
       return helper(1, n)

95. 不同的二叉搜索树 II的更多相关文章

  1. Java实现 LeetCode 95 不同的二叉搜索树 II(二)

    95. 不同的二叉搜索树 II 给定一个整数 n,生成所有由 1 - n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1, ...

  2. LeetCode 95——不同的二叉搜索树 II

    1. 题目 2. 解答 以 \(1, 2, \cdots, n\) 构建二叉搜索树,其中,任意数字都可以作为根节点来构建二叉搜索树.当我们将某一个数字作为根节点后,其左边数据将构建为左子树,右边数据将 ...

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

    不同的二叉搜索树2 给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null ...

  4. [LeetCode] 95. 不同的二叉搜索树 II ☆☆☆(递归,n个数组成的所有二叉搜索树)

    https://leetcode-cn.com/problems/unique-binary-search-trees-ii/solution/xiang-xi-tong-su-de-si-lu-fe ...

  5. [LeetCode] 95. 不同的二叉搜索树 II

    题目链接 : https://leetcode-cn.com/problems/unique-binary-search-trees-ii/ 题目描述: 给定一个整数 n,生成所有由 1 ... n ...

  6. 【力扣】95. 不同的二叉搜索树 II

    二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的 ...

  7. 95. 不同的二叉搜索树 II、96. 不同的二叉搜索树

    95 Tg:递归 这题不能算DP吧,就是递归 一个问题:每次的树都要新建,不能共用一个根节点,否则下次遍历对根左右子树的改动会把已经放进结果数组中的树改掉.. class Solution: def ...

  8. [leetcode]95.不同的二叉搜索树

    Posted by 微博@Yangsc_o 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 95. 不同的二叉搜索树 II 给你 ...

  9. 不同的二叉搜索树&II

    不同的二叉搜索树 只要求个数,递推根节点分割左右子树即可 class Solution { public int numTrees(int n) { int []dp=new int[n+1]; fo ...

随机推荐

  1. ASP.NET Core Identity 实战(3)认证过程

    如果你没接触过旧版Asp.Net Mvc中的 Authorize 或者 Cookie登陆,那么你一定会疑惑 认证这个名词,这太正式了,这到底代表这什么? 获取资源之前得先过两道关卡Authentica ...

  2. PNG,JPEG,BMP,JIF图片格式详解及其对比

    原文地址:http://blog.csdn.net/u012611878/article/details/52215985 图片格式详解 不知道大家有没有注意过网页里,手机里,平板里的图片,事实上,图 ...

  3. VC++常用数据类型及其操作详解

    原文地址:http://blog.csdn.net/ithomer/article/details/5019367 VC++常用数据类型及其操作详解 一.VC常用数据类型列表 二.常用数据类型转化 2 ...

  4. CentOS 6.3下NFS安装配置

    CentOS 6.3下NFS安装配置 一.环境介绍   NFS服务器:CentOS6.3 192.168.8.20 NFS客户端:CentOS6.5 192.168.8.39 二.服务器端安装配置   ...

  5. java调用monkeyrunner(亲测绝对可行)

    我自己试验了下和官方的API编写不太一样,老别扭了,建议还是用Python写吧 昨天在网上查了一下一天,都是转来贴别人的,真正敲的很少,我真不知道转的大侠你们自己敲了么? 先截一段不负责任的blog图 ...

  6. 使用 CSS overscroll-behavior 控制滚动行为:自定义下拉刷新和溢出效果

    CSS 的新属性 overscroll-behavior 允许开发者覆盖默认的浏览器滚动行为,一般用在滚动到顶部或者底部. 背景 滚动边界和滚动链接(boundary & chaining) ...

  7. 【前端】JS文本比较插件

    一.先上效果图 二.JS代码 /** * [文本比较插件] * 传递两个参数dom1.dom2,以dom1为基准进行比较. * 0)dom1和dom2不能都为空: * 1)如果dom1不存在,则dom ...

  8. Clipboard深度实践与采坑记录

    1.css禁止选择导致IOS无法复制 body{ -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: ...

  9. SpringMVC(3):DispatcherServlet详解

    原文出处: 张开涛 3.1.DispatcherServlet作用 DispatcherServlet是前端控制器设计模式的实现,提供spring Web MVC的集中访问点,而且负责职责的分派,而且 ...

  10. LeetCode(28): 实现strStr()

    Easy! 题目描述: 实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0 ...