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 ...
随机推荐
- MySQL各个版本区别及问题总结
参考:http://www.admin10000.com/document/62.html 一.简介 MySQL 的官网下载地址:http://www.mysql.com/downloads/ 在这个 ...
- 用命令打开本地tomcat服务器
1.点击开始菜单,搜索cmd,默认第一个结果是cmd.exe, 鼠标右键用管理员权限打开(win7及以上版本系统) 启动命令是net start tomcat8 (我电脑是tomcat8,如果是tom ...
- ubuntu系统下Python虚拟环境的安装和使用
ubuntu系统下Python虚拟环境的安装和使用 前言:进行python项目开发的时候,由于不同的项目需要使用不同的资源包和相关的配置,因此创建多个python虚拟环境,在虚拟环境下开 ...
- 玩树莓派(raspberry pi) 2/3 raspbian的遇到的一些问题
raspberry pi买回来玩了一段时间,现在就记录一下入门遇到的一些问题吧. 首先是烧写镜像,和安装电脑系统是一样的道理. 先要有一个制作一个U启动盘.先将SD卡格式化,再用Win32DiskIm ...
- Java基础96 ajax技术的使用
本文知识点(目录): 1.ajax的概念 2.使用ajax技术获取服务端的数据_实例 3.使用ajax技术检查用户名是否已存在_实例 4.使用ajax技术验证登录页面的用户名和密码_实例 ...
- oracle 进阶之model子句
本博客是自己在学习和工作途中的积累与总结,仅供自己参考,也欢迎大家转载,转载时请注明出处. http://www.cnblogs.com/king-xg/p/6692841.html 一, mode ...
- LeetCode(61):旋转链表
Medium! 题目描述: 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, ...
- hdu1561 树形dp,依赖背包
多重背包是某个物品可以选择多次,要把对物品数的枚举放在对w枚举外面 分组背包是某组的物品只能选一个,要把对每组物品的枚举放在对w枚举内侧 依赖背包是多层的分组背包,利用树形结构建立依赖关系,每个结点都 ...
- tyvj1051 选课
/* 分组背包+树形dp:以树的深度作为阶段,以节点编号作为一维状态, 思路:首先dp[u][t]表示选择以第u门课为根,选了t门课的最大值, 状态转移方程dp[u][t]=max(所有儿子中凑出t- ...
- python 全栈开发,Day108(客户管理之权限控制,客户管理之动态"一级"菜单,其他应用使用rbac组件,django static文件的引入方式)
一.客户管理之权限控制 昨天的作业,有很多不完善的地方 下载代码,基本实现权限验证 https://github.com/987334176/luffy_permission/archive/v1.2 ...