博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
95. 不同的二叉搜索树 II
阅读量:5141 次
发布时间:2019-06-13

本文共 2425 字,大约阅读时间需要 8 分钟。

题意

给定一个整数 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)

转载于:https://www.cnblogs.com/George1994/p/10621899.html

你可能感兴趣的文章
Java习题10.24
查看>>
第三百六十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mget和bulk批量操作...
查看>>
Weka 入门3
查看>>
POJ 3581 Sequence(后缀数组)题解
查看>>
mouseout和mouseover、mouseenter和mouseleave
查看>>
easyui datagrid load 封装 参数问题 js 作用域
查看>>
win10常用快捷键、
查看>>
关于C语言求两个数的最大公约数
查看>>
常用的public.js
查看>>
Redis-ha(sentinel)
查看>>
【Tomcat】tomcat中server.xml配置详解
查看>>
测试员的工作与学习
查看>>
SpringBoot+SpringSecurity之多模块用户认证授权同步
查看>>
【http】http/1.1 八种请求方式
查看>>
pointer-events:none 限制鼠标事件及对覆盖元素层进行穿透
查看>>
简单的嵌套循环和文件操作
查看>>
使用拦截器拦截html参数
查看>>
两数之和
查看>>
k个一组翻转链表(java实现)
查看>>
UML要点总结(一)
查看>>