当前位置: 首页 > 编程日记 > 正文

刻意练习: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”、“智能机器人研究中心”和“大数据与哲学社会科学实验室”的一员。

愿我们一起学习,一起进步,相互陪伴,共同成长。

后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码:

相关文章:

windows phone 越狱教程:利用学生帐号解锁并部署软件教程(图文并茂)

之前老是看到有学生帐号可以越狱,但一直以来都觉得比较复杂,不想下手.近日,TX微信出来了,很多人都想装,可是装不了,所以下决心研究一下学生帐号越狱.网上看教程,发现很多都是不全面,有些只有一半,最后还是决定按我自己申请学生帐号时的流程写一个教程,希望对大家有所帮助. 学生…

基于web创建逼真的3D图形 | CSS技巧

在成为一名web开发者之前&#xff0c;我从事于视觉设计行业&#xff0c;创造屡获殊荣&#xff0c;电影和电视节目等高端3D效果&#xff0c;例如 Tron, The Thing, Resident Evil,和 Vikings 。为了能够创造这些效果&#xff0c;我们需要使用高度复杂的动画软件&#xff0c;例如…

jQuery元素内容操作的方法有多少种?

jQuery中操作元素内容的方法&#xff0c;主要包括html()方法、text()方法和val()方法。html()方法用于获取或设置元素的HTML内容&#xff0c;text()方法用于获取或设置元素的文本内容&#xff0c;val()方法用来获取或设置表单元素的value值。具体使用说明如表1所示。 表1 元素内…

获取SQLServer数据库中所有表

对于获取SQLSERVER数据库中所有表&#xff0c;首先第一步引有SQLDMO.dll 找到文件路径: C:\Program Files\Microsoft SQL Server\80\Tools\Binn\SQLDMO.dll 找到SQLDOM.DLL //在后台写方法 using System;using System.Collections.Generic;using System.Linq;using Syst…

刻意练习:LeetCode实战 -- Task24. 恢复二叉搜索树

背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法&#xff08;Leetcode&#xff09;刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式&#xff0c;即选择了五个知识点&#xff08;数组、链表、字符串、树、贪心算法&#xff09;&#xff0c;每个知识点选择了…

Solaris下ftp配置(初稿-待补充)

1.自带ftp版本 Version wu-2.6.2 2.ftp启动与停止 启动并启用ftp: svcadm enable network/ftp 停止并禁用ftp: svcadm disable network/ftp 3.使某个系统用户无法使用ftp或者恢复使用ftp vi /etc/ftpd/ftpusers 向其中添加要禁止使用ftp的…

女生参加web前端培训可以吗

​ 近几年&#xff0c;web前端被视为互联网行业最热门编程语言技术之一&#xff0c;越来越多的人开始想要学习web前端技术&#xff0c;其中不乏有一些女性学习&#xff0c;那么很多人就要问了&#xff0c;女生参加web前端培训可以吗?我们来看看下面的详细介绍吧。 ​  女生参…

春节期间停止更新

非常抱歉地跟各位说一下&#xff0c;因为老家并没有拉宽带&#xff0c;所以春节期间无法进行更新。虽然说我可以背着笔记本回家&#xff0c;然后再到朋友处蹭一下网络。但想到一年365天&#xff0c;能回家的就那么几天&#xff0c;只是想好好陪陪父母&#xff0c;伴伴自己的老婆…

刻意练习:LeetCode实战 -- Task26.判断子序列

背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法&#xff08;Leetcode&#xff09;刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式&#xff0c;即选择了五个知识点&#xff08;数组、链表、字符串、树、贪心算法&#xff09;&#xff0c;每个知识点选择了…

spring @component的作用

转自&#xff1a;https://www.cnblogs.com/lyjing/p/8427832.html1、controller 控制器&#xff08;注入服务&#xff09; 2、service 服务&#xff08;注入dao&#xff09; 3、repository dao&#xff08;实现dao访问&#xff09; 4、component &#xff08;把普通pojo实例化到…

使用JavaScript变量需要注意哪些语法细节?

使用JavaScript变量需要注意哪些语法细节?JavaScript在很多地方经常会涉及到&#xff0c;尤其是JavaScript变量这方面&#xff0c;在使用变量时&#xff0c;还有一些值得注意的语法细节&#xff0c;下面进行详细讲解。 使用JavaScript变量需要注意哪些语法细节? 1. 更新变量的…

手把手教你搭建一个学习Python好看的 Jupyter 环境

又到摆脱重复工作&#xff0c;换个心情&#xff0c;然而并没有软用的时间了。这次&#xff0c;教大家如何搭建一个好看的jupyter环境。安装Jupyter先来展示一下我的环境python: 3.5.*macos: 10.12.4安装Jupyter的过程只需安装Anaconda即可。测试一下初始设置&#xff1a;jupyte…

刻意练习:LeetCode实战 -- Task27.分发饼干

背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法&#xff08;Leetcode&#xff09;刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式&#xff0c;即选择了五个知识点&#xff08;数组、链表、字符串、树、贪心算法&#xff09;&#xff0c;每个知识点选择了…

祝贺《WCF邮件通信系统》在高阳市场研究汇编第五期发表

上次给公司的市场研究汇编投稿&#xff0c;只写了一个PPT格式的《WCF邮件通信系统》&#xff0c;编辑把它整理成了PDF格式的内容&#xff0c;感觉很好&#xff0c;所以我把PDF原文中的有关内容存储成了图片&#xff0c;发表在这里&#xff0c;庆贺一下。PDF原文地址&#xff1a…

学软件测试有前途吗

学软件测试有前途吗?很多人都关心这个问题&#xff0c;最近几年&#xff0c;软件测试这个行业在很多企业都是非常刚需的&#xff0c;随着互联网的飞快发展&#xff0c;IT行业出现日新月异的变化&#xff0c;企业的大量需求&#xff0c;人才的严重匮乏&#xff0c;导致IT行业&a…

Active Directory 账号迁移配置介绍

首先介绍一下环境: 生产域环境: example.cn 测试域环境: fengdian.info 系统平台: 2K08 R2 林、域功能级别&#xff1a;Windows Server 2008 要求: 测试域环境“fengdian.info”同步生产域环境所有用户账号&#xff0c;实现测试环境和生产环境的基本统 一&#xff0c;方便功能测…

VIM命令快速记忆(转自杰哥)

因为自己也是个linuxer 熟练运用VIM是必须的&#xff0c;恰好学长杰哥对此有研究&#xff0c; 转来给大家分享。对此表达对杰哥的敬意。 有好东西分享给大家才能相互学习是吧。 要做个Linuxer&#xff0c;VIM的操作是必须就跟手指头盲打键盘那么熟练。 首先说下Vim的两种最常用…

刻意练习:LeetCode实战 -- Task28.跳跃游戏

背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法&#xff08;Leetcode&#xff09;刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式&#xff0c;即选择了五个知识点&#xff08;数组、链表、字符串、树、贪心算法&#xff09;&#xff0c;每个知识点选择了…

类操作是什么意思?jQuery的类操作教程

类操作就是通过操作元素的类名进行元素样式操作&#xff0c;当元素样式比较复杂时&#xff0c;如果通过css()方法实现&#xff0c;需要在CSS里编写很长的代码&#xff0c;既不美观也不方便。而通过写一个类名&#xff0c;把类名加上或去掉就会显得很方便。下面通过代码演示类的…

刻意练习:LeetCode实战 -- Task29. 加油站

背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法&#xff08;Leetcode&#xff09;刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式&#xff0c;即选择了五个知识点&#xff08;数组、链表、字符串、树、贪心算法&#xff09;&#xff0c;每个知识点选择了…

C#从SQL server数据库中读取l图片和存入图片

一、从图片中获得二进制值的基本方法&#xff1a;Image.Save 方法 (String, ImageFormat) 这会将保存 Image 写入指定的文件中指定的格式。 命名空间: System.Drawing 程序集: System.Drawing&#xff08;位于 System.Drawing.dll&#xff09; 语法&#xff1a; public void S…

linux下查看内存使用情况

在Linux下查看内存我们一般用free命令&#xff1a;[rootscs-2 tmp]# free total used free shared buffers cachedMem: 3266180 3250004 16176 0 110652 2668236-/ buffers/cache: 471116 2795064Swa…

现在转行学习UI设计好不好就业

​ UI设计是很多企业都会有需求的一个岗位&#xff0c;对于现在转行学习UI设计好不好就业这个问题&#xff0c;小编的回答是肯定的&#xff0c;最直接的方法就是上招聘信息&#xff0c;如果说招聘网站上UI设计师职位很少&#xff0c;那就说明UI设计行业已经差不多饱和了。 ​ …

刻意练习:LeetCode实战 -- Task30.通配符匹配

背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法&#xff08;Leetcode&#xff09;刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式&#xff0c;即选择了五个知识点&#xff08;数组、链表、字符串、树、贪心算法&#xff09;&#xff0c;每个知识点选择了…

iOS 11 安全区域适配总结

2019独角兽企业重金招聘Python工程师标准>>> 导语&#xff1a;本文主要是对iOS 11下APP中tableView内容下移20pt或下移64pt的问题适配的一个总结。内容包括五个部分&#xff1a;问题的原因分析、adjustContentInset属性的计算方式、什么情况下的tableView会发生内容…

(广州)软件开发定制服务,工作流引擎 OA 库存管理系统

本人专注于工作流的研究设计同时提供软件开发定制服务,工作流引擎 OA系统 库存管理系统 如果有机会合作共事请联系&#xff1a;15817167503&#xff08;本人在广州&#xff09; QQ&#xff1a;1311663711 加时请注明软件定制 广州软件定制开发 转载于:https://www.cnblogs.com/…

Java类加载机制详解【java面试题】

Java类加载机制详解【java面试题】 (1)问题分析&#xff1a; Class文件由类装载器装载后&#xff0c;在JVM中将形成一份描述Class结构的元信息对象&#xff0c;通过该元信息对象可以获知Class的结构信息&#xff1a;如构造函数&#xff0c;属性和方法等&#xff0c;Java允许用户…

C#获取文件的当前路径

1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName &#xff0d;获取模块的完整路径。 2.System.Environment.CurrentDirectory &#xff0d;获取和设置当前目录(该进程从中启动的目录)的完全限定目录。 3.System.IO.Directory.GetCurrentDirectory() &a…

c# ThreadPool 判断子线程全部执行完毕的四种方法

1、先来看看这个多线程编程多线程用于数据采集时&#xff0c;速度明显很快&#xff0c;下面是基本方法&#xff0c;把那个auto写成采集数据方法即可。using System;using System.Collections.Generic;using System.Text;using System.Threading;namespace ConsoleApplication1{…

腾讯精选练习 50 题(Leetcode)笔记 PDF下载!

昨天在知识星球中立了一个Flag&#xff0c;第一步采取的行动就是把以前刷的“腾讯精选练习 50 题”重新梳理一下&#xff0c;就有了今天这本170多页的小册子。 这本小册子即可以作为学习数据结构与算法课程的参考资料&#xff0c;也可以作为备考计算机类研究生的备考资料。希望…