95. 不同的二叉搜索树 II
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的更多相关文章
- Java实现 LeetCode 95 不同的二叉搜索树 II(二)
95. 不同的二叉搜索树 II 给定一个整数 n,生成所有由 1 - n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1, ...
- LeetCode 95——不同的二叉搜索树 II
1. 题目 2. 解答 以 \(1, 2, \cdots, n\) 构建二叉搜索树,其中,任意数字都可以作为根节点来构建二叉搜索树.当我们将某一个数字作为根节点后,其左边数据将构建为左子树,右边数据将 ...
- Leetcode 95.不同的二叉搜索树II
不同的二叉搜索树2 给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null ...
- [LeetCode] 95. 不同的二叉搜索树 II ☆☆☆(递归,n个数组成的所有二叉搜索树)
https://leetcode-cn.com/problems/unique-binary-search-trees-ii/solution/xiang-xi-tong-su-de-si-lu-fe ...
- [LeetCode] 95. 不同的二叉搜索树 II
题目链接 : https://leetcode-cn.com/problems/unique-binary-search-trees-ii/ 题目描述: 给定一个整数 n,生成所有由 1 ... n ...
- 【力扣】95. 不同的二叉搜索树 II
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的 ...
- 95. 不同的二叉搜索树 II、96. 不同的二叉搜索树
95 Tg:递归 这题不能算DP吧,就是递归 一个问题:每次的树都要新建,不能共用一个根节点,否则下次遍历对根左右子树的改动会把已经放进结果数组中的树改掉.. class Solution: def ...
- [leetcode]95.不同的二叉搜索树
Posted by 微博@Yangsc_o 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 95. 不同的二叉搜索树 II 给你 ...
- 不同的二叉搜索树&II
不同的二叉搜索树 只要求个数,递推根节点分割左右子树即可 class Solution { public int numTrees(int n) { int []dp=new int[n+1]; fo ...
随机推荐
- jrockit静默安装笔记
操作系统安装版本:CentOS-6.4-i386-minimal JDK安装版本:jrockit-jdk1.6.0_20-R28.1.0-4.0.1-linux-ia32 1.通过SecureFX工具 ...
- 【bzoj2653】【middle】【主席树+二分答案】
Description 一个长度为 n 的序列 a ,设其排过序之后为 b ,其中位数定义为 b[n/2] ,其中 a,b 从 0 开始标号 , 除法取下整. 给你一个长度为 n 的序列 s .回答 ...
- oracle 命令行
背景 看到当初竟然记录了命令行,想想自己用了多久才知道了命令行,好像有几年了吧.当时还记得买了两本oracle9的管理书籍,就跟见了九阴真经一样,从头到尾熟悉了好几遍,不过也大部分忘了交给老师了.以下 ...
- 服务发现之consul的介绍、部署和使用
什么是服务发现 微服务的框架体系中,服务发现是不能不提的一个模块.我相信了解或者熟悉微服务的童鞋应该都知道它的重要性.这里我只是简单的提一下,毕竟这不是我们的重点.我们看下面的一幅图片: 图中 ...
- css怎么让页面上的内容不能被选中
body{ -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-se ...
- laravel使用when搜索遇到状态参数(有0的状态)的坑
今天,使用when()方法写活动列表的接口,有两个状态搜索,都有0这个状态,当传参为0时when()就失效了... 反反复复的验证参数,传参确实是0和1啊...百思不得其解~~~后面仔细想想when( ...
- poj1015 01二维背包
/* 给定辩控双方给每个人的打分p[i],d[i], dp[j][k]表示前i个人有j个被选定,选定的人的辩控双方打分差之和是k,此状态下的最大辩控双方和 按01背包做,体积一维是1,体积二维是辩控双 ...
- python 全栈开发,Day94(Promise,箭头函数,Django REST framework,生成json数据三种方式,serializers,Postman使用,外部python脚本调用django)
昨日内容回顾 1. 内容回顾 1. VueX VueX分三部分 1. state 2. mutations 3. actions 存放数据 修改数据的唯一方式 异步操作 修改state中数据的步骤: ...
- 传统DOM事件处理程序
传统DOM事件处理程序与比HTML事件处理程序相比,优点:可以将HTML和JS脚本分离. 它的操作形式如下 : <body> <div>传统DOM事件处理程序与比HTML事件处 ...
- F 多重背包 判断能否刚好装满
Description 有n种不同大小的数字,每种各个.判断是否可以从这些数字之中选出若干使它们的和恰好为K. Input 首先是一个正整数T(1<=T<=100)接下来是T组数据每组数据 ...