刻意练习:LeetCode实战 -- Task23. 不同的二叉搜索树 II
背景
本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了 三个简单、两个中等、一个困难 等级的题目,共计三十道题,利用三十天的时间完成这组刻意练习。
本次任务的知识点:树
树 是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由 n(n>0)
个有限节点组成的一个具有层次关系的集合。
把它叫做「树」是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
它具有以下的特点:
- 每个节点都只有有限个子节点或无子节点;
- 没有父节点的节点称为根节点;
- 每一个非根节点有且只有一个父节点;
- 除了根节点外,每个子节点可以分为多个不相交的子树;
- 树里面没有环路。
题目
- 题号:95
- 难度:中等
- https://leetcode-cn.com/problems/unique-binary-search-trees-ii/
给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。
示例:
输入: 3
输出:
[[1,null,3,2],[3,2,null,1],[3,1,null,null,2],[2,1,3],[1,null,2,null,3]
]
解释:
以上的输出对应以下 5 种不同结构的二叉搜索树:1 3 3 2 1\ / / / \ \3 2 1 1 3 2/ / \ \2 1 2 3
实现
第一种:递归
如果将i
作为根节点,那么[1, i-1]
为i
的左子树节点,[i+1, n]
为右子树节点。
问题就被拆分为两个子问题了:
- 求左区间构成的所有二叉搜索树作为
i
的左子树 - 求右区间构成的所有二叉搜索树作为
i
的右子树
递归终止条件:
- 区间为空,返回null。
- 区间的左右端点相同,即只包含一个数,返回该数构成的根结点。
以上就是利用递归求解该问题的思路。
- 执行结果:通过
- 执行用时:256 ms, 在所有 C# 提交中击败了 43.40% 的用户
- 内存消耗:28.6 MB, 在所有 C# 提交中击败了 9.09% 的用户
/*** Definition for a binary tree node.* public class TreeNode {* public int val;* public TreeNode left;* public TreeNode right;* public TreeNode(int x) { val = x; }* }*/
public class Solution
{public IList<TreeNode> GenerateTrees(int n){if (n == 0){return new List<TreeNode>();}return GenerateTrees(1, n);}public List<TreeNode> GenerateTrees(int start, int end){List<TreeNode> lst = new List<TreeNode>();//此时没有数字,将 null 加入结果中if (start > end){lst.Add(null);return lst;}//只有一个数字,当前数字作为一棵树加入结果中if (start == end){TreeNode tree = new TreeNode(start);lst.Add(tree);return lst;}//尝试每个数字作为根节点for (int i = start; i <= end; i++){//得到所有可能的左子树List<TreeNode> leftTrees = GenerateTrees(start, i - 1);//得到所有可能的右子树List<TreeNode> rightTrees = GenerateTrees(i + 1, end);//左子树右子树两两组合foreach (TreeNode leftTree in leftTrees){foreach (TreeNode rightTree in rightTrees){TreeNode root = new TreeNode(i);root.left = leftTree;root.right = rightTree;//加入到最终结果中lst.Add(root);}}}return lst;}
}
Python 语言
- 执行结果:通过
- 执行用时:52 ms, 在所有 Python3 提交中击败了 87.67% 的用户
- 内存消耗:15.2 MB, 在所有 Python3 提交中击败了 6.19% 的用户
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = Noneclass Solution:def generateTrees(self, n: int) -> List[TreeNode]:if n == 0:return list()return self.generate(1, n)def generate(self, start: int, end: int) -> List[TreeNode]:lst = list()if start > end:lst.append(None)return lstif start == end:tree = TreeNode(start)lst.append(tree)return lstfor i in range(start, end + 1):leftTrees = self.generate(start, i - 1)rightTrees = self.generate(i + 1, end)for leftTree in leftTrees:for rightTree in rightTrees:tree = TreeNode(i)tree.left = leftTreetree.right = rightTreelst.append(tree)return lst
往期活动
LSGO软件技术团队会定期开展提升编程技能的刻意练习活动,希望大家能够参与进来一起刻意练习,一起学习进步!
- Python基础刻意练习活动即将开启,你参加吗?
- Task01:变量、运算符与数据类型
- Task02:条件与循环
- Task03:列表与元组
- Task04:字符串与序列
- Task05:函数与Lambda表达式
- Task06:字典与集合
- Task07:文件与文件系统
- Task08:异常处理
- Task09:else 与 with 语句
- Task10:类与对象
- Task11:魔法方法
- Task12:模块
我是 终身学习者“老马”,一个长期践行“结伴式学习”理念的 中年大叔。
我崇尚分享,渴望成长,于2010年创立了“LSGO软件技术团队”,并加入了国内著名的开源组织“Datawhale”,也是“Dre@mtech”、“智能机器人研究中心”和“大数据与哲学社会科学实验室”的一员。
愿我们一起学习,一起进步,相互陪伴,共同成长。
后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码:
刻意练习:LeetCode实战 -- Task23. 不同的二叉搜索树 II相关推荐
- leetcode算法题--不同的二叉搜索树 II
原题链接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii/ 此题的思路是对所有n为根节点情况进行遍历,然后对其左右子树进行 ...
- leetcode算法题--不同的二叉搜索树
原题链接:https://leetcode-cn.com/problems/unique-binary-search-trees/ 相关题目:leetcode算法题--不同的二叉搜索树 II 1.递归 ...
- 20200721:每日一题之不同的二叉搜索树 II(leetcode95)
不同的二叉搜索树 II 题目 思路与算法 代码实现 复杂度分析 题目 思路与算法 很基本的思路就是递归,没太多其他想法,直接根据二叉搜索树的性质进行递归即可. 代码实现 class Solution ...
- Leetcode95. 不同的二叉搜索树 II(C语言)
Leetcode95. 不同的二叉搜索树 II(C语言) 算法-分治:算法与数据结构参考 题目: 给定一个整数 n,生成所有由 1 - n 为节点所组成的二叉搜索树1.例: 输入: 3 输出: [ [ ...
- LeetCode 272. 最接近的二叉搜索树值 II(栈+优先队列)
文章目录 1. 题目 2. 解题 1. 题目 给定一个不为空的二叉搜索树和一个目标值 target,请在该二叉搜索树中找到最接近目标值 target 的 k 个值. 注意: 给定的目标值 target ...
- LeetCode 1214. 查找两棵二叉搜索树之和(二叉树迭代器+双指针)
文章目录 1. 题目 2. 解题 1. 题目 给出两棵二叉搜索树,请你从两棵树中各找出一个节点,使得这两个节点的值之和等于目标值 Target. 如果可以找到返回 True,否则返回 False. 示 ...
- LeetCode 270. 最接近的二叉搜索树值
文章目录 1. 题目 2. 解题 2.1 暴力查找 2.2 二分查找 1. 题目 给定一个不为空的二叉搜索树和一个目标值 target,请在该二叉搜索树中找到最接近目标值 target 的数值. 注意 ...
- LeetCode 95. 不同的二叉搜索树 II(递归)
1. 题目 给定一个整数 n,生成所有由 1 - n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [[1,null,3,2],[3,2,null,1],[3,1,null,null,2], ...
- LeetCode 109. 有序链表转换二叉搜索树(快慢指针+递归)
1. 题目 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 来源:力扣(LeetC ...
最新文章
- 秒杀业务架构优化之路--转
- php运行出现Call to undefined function curl_init()解决方法
- python使用的一些小事儿
- C++11并发实战(专栏)
- magento如何如何找到对应html文件_Servlet如何配置xml
- 补习系列(19)-springboot JPA + PostGreSQL
- agx 安装ros opencv_(五)树莓派3开发环境搭建——5.Android手机端与robot端ROS网络通信...
- 变步长的梯形求积法matlab,基于MATLAB的变步长梯形数值积分法的研究与实验
- 你是我心中永远抹不掉的痛
- 比较好的JavaScript库-日常备用
- Eclipse的环境变量如何配置和为什么要配置环境变量?
- ddt数据驱动常见的用法【多测师_王sir】
- 区块链游戏:何为虚拟?何为现实?
- jsp微信二维码收款_java实现微信支付之扫码支付
- 返回多字段并用数组分割方式展示
- CMOS反相器设计与仿真
- 下载学习通上没有下载权限的文件
- Java小农养成记第八天
- 中级微观经济学:Chap 7 显示偏好
- 华为云CCE服务不同访问方式(ingress,elb)
热门文章
- 台式计算机刚换的显示屏怎么设置,台式机怎么样切换显示器
- 软件测试的准入准出是什么?标准是什么?
- C++语言学习(十二)——C++语言常见函数调用约定
- 如何用ABAP代码读取CDS view association的数据
- SharePoint运行状况分析器有关磁盘空间不足的警告
- 使用joda-time工具类 计算时间相差多少 天,小时,分钟,秒
- 使用memcache做web缓存
- Ubuntu下自动挂载Windows分区的方法
- 一个表对应另一个表中多个主键的查询方法(把一个表当成两个表用)
- 针对抓win2003系统密码的诡计