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. Salt Document学习笔记1

    原文来自Salt Documentation,作者是 Thomas Hatch),我摘抄部分可能今后会用到或适合入门到精通的一些原文段落,简单翻译后发上来,便于查阅和研究 一.原理方面:The net ...

  2. redis拾趣(客户端连接,keys命令,数据备份,缓存有效期等)

    1.客户端连接 为了安全保护,redis支持绑定IP跟端口,这个通过conf配置文件中的bind跟port来设置. 绑定后登录client控制台时就需要写明ip(或者hostname)跟端口了,如: ...

  3. lvs基本概念、调度方法、ipvsadm命令及nat模型示例

    LVS类型: NAT:-->(DNAT) DR TUN FULLNAT LVS的常见名词解释 CIP<-->VIP--DIP<-->RIP Direct Routing: ...

  4. IDEA测试结果查看

    点击漏斗图标切换查看测试日志信息,点击,导出测试报告

  5. [学习笔记]JS计数器,闭包和localStorage

    1.前言 Javascript也算用了挺久了,为了得到一个变量,类似Java的静态变量的功能,我想到了很早以前学习JS的闭包,还有做俄罗斯方块的排行榜用到LocalStorage技术,所以想总结一下, ...

  6. 基于python的k-s值计算

    做评分卡模型时(假设有多个自变量,因变量即是否违约.)通常需要筛选变量. k-s值的作用类似于AUC,它期初是用来评价模型(变量)对是否违约事件的区分程度的. # -*- coding: utf-8 ...

  7. Oracle 相关概念

    注:本文来源于 <腾科OCP培训课堂>.非准许商业活动. 标题:Oracle  相关概念 --->数据库名.实例名.数据库域名.全局数据名.服务名 一:数据库名 1:什么是数据库名 ...

  8. bzoj 2142

    数论大集合 只要你做完了这道题,除了线性筛和降幂公式以外,所有数论noip知识点就都会了... 题意:求C(n,∑w)*C(∑w,w1)*C(∑w-w1,w2).....mod p(不保证p为质数) ...

  9. MyBatis查询,返回值Map或List<Map>

    一.返回值Map 1.mapper.xml <select id="selectUserMapLimitOne" resultType="java.util.Has ...

  10. springbank 开发日志 springbank是如何执行一个handler的requestMapping对应的方法的

    占位 从dispatcher说起,方法doDispatch(Map request)的参数request是一个通过解析来报报文新城的map //获取HandlerExecutionChain,其中封装 ...