线段树 java_LeetCode刷题总结-树篇(中)

2023-10-23 10:20

本文主要是介绍线段树 java_LeetCode刷题总结-树篇(中),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本篇接着《LeetCode刷题总结-树篇(上)》,讲解有关树的类型相关考点的习题,本期共收录17道题,1道简单题,10道中等题,6道困难题。

在LeetCode题库中,考察到的不同种类的树有七种,分别是二叉搜索树、平衡二叉树、满二叉树、完全二叉树、线段树、字典树和树状数组。每一种类型的树,有着不同的特性以及对应的考察重点。考察重点可参考下图,下文按照树的类型分别划分了一个目录章节,并给出了对应的经典习题。

874be7182dd98bc0bae69283c4b056b6.png

1 二叉树搜索树

基本定义:又称二叉查找树,二叉排序树。若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。参考示例图如下(图片来源):

8802d61a2d243f7a4dbe3e29d041c4ea.png

考察重点:二叉搜索树的创建问题、删除二叉树的指定节点、修改二叉树节点的值、添加节点。

由于二搜索树自身的特殊性质,可知插入和查找具体节点的时间复杂度为O(logn)。另外,需要谨记应用中序遍历二叉搜索树得到的序列为升序序列。对于添加、修改二叉树的节点问题,中序遍历的思想一般能够提供较好的解答思路。

本部分收录的习题(下面出现的数字为对应题目在LeetCode题库中的序号),具体如下:

95.不同的二叉搜索树 II,难度:中等 (考察搜索二叉树的创建问题)

99.恢复二叉搜索树,难度:困难 (考察搜索二叉树修改节点的问题)

450.删除二叉搜索树中的节点,难度:中等(考察搜索二叉树节点删除问题)

701.二叉搜索树中的插入,难度:中等(考察搜索二叉树节点的插入问题)

对于上述四类考点,应用Java实现删除二叉搜索树中节点时,由于采用递归的解法,需要特别注意深拷贝和浅拷贝的问题。另外,对于删除操作可以采用地址覆盖的操作来实现,此部分的操作代码可以作为模板记住。下面具体给出题号为450题目的描述及解答代码。

题目描述:

4e6aa2a3f42d8fe9d111b70b713bfa96.png

解答代码:

classSolution {public TreeNode deleteNode(TreeNode root, intkey) {if (root == null)return null;if (key < root.val) { //待删除节点在左子树中

root.left =deleteNode(root.left, key);returnroot;

}else if (key > root.val) { //待删除节点在右子树中

root.right =deleteNode(root.right, key);returnroot;

}else { //key == root.val,root 为待删除节点

if (root.left == null) //返回右子树作为新的根

returnroot.right;else if (root.right == null) //返回左子树作为新的根

returnroot.left;else { //左右子树都存在,返回后继节点(右子树最左叶子)作为新的根

TreeNode successor =min(root.right);

successor.right=deleteMin(root.right);

successor.left=root.left;returnsuccessor;

}

}

}privateTreeNode min(TreeNode node) {if (node.left == null)returnnode;returnmin(node.left);

}privateTreeNode deleteMin(TreeNode node) {if (node.left == null)returnnode.right;

node.left=deleteMin(node.left);returnnode;

}

}

2 平衡二叉树

基本定义:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。参考示例图如下(图片来源)

8537471fc903606e4b9384073d4e2ba9.png

考察重点:给定一棵二叉树,检测该树是否为平衡二叉树。即考察我们递归遍历树的每个节点,检测每个节点对应的左右子树的高度差是否不大于1。

本部分收录的习题:

110.平衡二叉树,难度:简单

3 满二叉树

基本定义:每个结点恰好有 0 或 2 个子结点。

考察重点:给定若干个元素,求能够组成的不同满二叉树的个数。

本部分收录的习题:

894.所有可能的满二叉树,难度:中等

4 完全二叉树

基本定义:完全二叉树从根结点到倒数第二层满足完美二叉树,最后一层可以不完全填充,其叶子结点都靠左对齐。(附完美二叉树定义:一个深度为k(>=-1)且有2^(k+1) - 1个结点的二叉树称为完美二叉树。)参考示例图如下(图片来源):

6ff685546a904a2d3bc0a38bd30ea39c.png

考察重点:统计给定树的节点个数、创建完全二叉树以及检测给定树是否为完成二叉树。

本部分收录的习题:

222.完全二叉树的节点个数,难度:中等(考察统计节点个数)

919.完全二叉树插入器,难度:中等(考察创建完全二叉树)

958.二叉树的完全性检验,难度:中等(考察检测是否为完全二叉树)

5 线段树

基本定义:线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。参考示例图如下(图片来源):

d653caef0a7c568f3867feb655e32199.png

实际应用:使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。

考察重点:给定问题,灵活转换为线段树求解。

应用Java语言创建线段树时,可以借助内置的TreeSet和TreeMap数据结构。TreeSet是HashSet的升级版,TreeMap则是HashMap的升级版

本部分收录的习题:

715. Range模块,难度:困难(可以采用TreeSet构建线段树,需要熟悉TreeSet在Java中相关接口的用法)

732.我的日程安排表III ,难度:困难 (可以采用TreeMap构建模拟化线段树,需要熟悉TreeMap在Java中相关接口的用法)

850.矩形面积II,难度:困难(考察定义线段树的标准解法)

6 字典树

基本定义(百度百科):又称单词查找树、前缀树、Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。参考示例图如下(图片来源):

66d4ac8bc55ce6cf0efc2bc617308a4a.png

考察重点:创建字典树、单词搜索。

本部分收录的习题:

208.实现Trie(前缀树),难度:中等(考察创建字典树)

212.单词搜索II,难度:困难(考察单词搜索)

648.单词替换,难度:中等(考察单词搜索)

7 树状数组

基本定义(百度百科):是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值;经过简单修改可以在log(n)的复杂度下进行范围修改,但是这时只能查询其中一个元素的值(如果加入多个辅助数组则可以实现区间修改与区间查询)。参考示例图如下(图片来源):

614490176fd70c0b2f05afd894e18909.png

考察重点:构建树状数组。

本部分收录的习题:

307.区域和检索-数组可修改,难度:中等

315.计算右侧小于当前元素的个数,难度:困难

这篇关于线段树 java_LeetCode刷题总结-树篇(中)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/267208

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

javacv依赖太大导致jar包也大的解决办法

《javacv依赖太大导致jar包也大的解决办法》随着项目的复杂度和依赖关系的增加,打包后的JAR包可能会变得很大,:本文主要介绍javacv依赖太大导致jar包也大的解决办法,文中通过代码介绍的... 目录前言1.检查依赖2.更改依赖3.检查副依赖总结 前言最近在写项目时,用到了Javacv里的获取视频

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC