Java中的二叉搜索树(如果想知道Java中有关二叉搜索树的知识点,那么只看这一篇就足够了!)

        前言:Java 提供了丰富的数据结构来处理和管理数据,其中 TreeSet 和 TreeMap 是基于红黑树实现的集合和映射接口。它们有序地存储数据,提供高效的搜索、插入和删除操作。


✨✨✨这里是秋刀鱼不做梦的BLOG

✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客

先让我们看一下本文大致的讲解内容:

目录

1.二叉搜索树的认识

        (1)二叉搜索树的概念

        (2)二叉搜索树的性质

2.有关二叉搜索树的常用操作

        【1】插入操作

        【2】查找操作

        【3】删除操作

1.cur.left == null

2.cur.right == null

3.cur.left != null && cur.right != null

3.二叉树的应用场景

1. 数据结构和算法

2. 数据库和文件系统

3. 图形和游戏开发


1.二叉搜索树的认识

        (1)二叉搜索树的概念

        在开始学习TreeSet与TreeMap之前,我们需要先学习一下Java中的二叉搜索树,二叉搜索树是一种特殊的二叉树,其中每个节点都有一个值,并满足以下性质:

  • 对于每个节点,左子树所有节点的值都小于该节点的值。

  • 对于每个节点,右子树所有节点的值都大于该节点的值。

如图:

从上图中我们可以很明显的观察出二叉搜索树的上述两个特性。

        (2)二叉搜索树的性质

        在了解完了二叉搜索树的概念之后,我们需要学习一下有关二叉搜索树的性质,对于一棵二叉搜索树而言,其都有以下三个性质:

  • 有序性:二叉搜索树的中序遍历结果是一个递增的有序序列。

  • 动态性:二叉搜索树支持动态插入和删除操作,适用于需要频繁更新的数据集合。

  • 查找效率:在理想情况下,二叉搜索树的查找、插入和删除操作的时间复杂度为 O(log n)。

        ——这里读者可能会对其中的一些性质不是很理解,没有关系,继续向下进行阅读即可,在后续的文本中,我们会慢慢的理解其中的意思。

2.有关二叉搜索树的常用操作

        【1】插入操作

        插入操作用于向二叉搜索树中插入新值。插入过程从根节点开始,根据当前节点的值与新值的比较结果,决定将新值插入到左子树还是右子树。

以下是实现该操作的代码:

public void insertNode(int key) {// 如果根节点为空,直接插入新节点作为根节点if (root == null) {root = new TreeNode(key);return;}// 初始化当前节点为根节点,父节点为nullTreeNode cur = root;TreeNode parent = null;TreeNode node = new TreeNode(key);// 寻找合适的位置插入节点while (cur != null) {if (cur.val < key) { // 当前值小于插入值,向右子树移动parent = cur;cur = cur.right;} else if (cur.val > key) { // 当前值大于插入值,向左子树移动parent = cur;cur = cur.left;} else { // 当前值等于插入值,直接返回,不插入重复值return;}}// 根据父节点值与插入值的比较结果,插入新节点到左子树或右子树if (parent.val > key) {parent.left = node;} else {parent.right = node;}
}

读者可以跟着下面的解释来对上边的代码进行理解:

  1. 根节点为空检查

    • 如果 root 为空,直接将新节点 TreeNode(key) 作为根节点插入,并返回。
  2. 初始化当前节点和父节点

    • cur 用于遍历树,从 root 开始。
    • parent 用于记录 cur 的父节点。
  3. 寻找合适的插入位置

    • cur 不为空时,比较 cur.valkey
      • 如果 cur.val 小于 key,移动到右子树。
      • 如果 cur.val 大于 key,移动到左子树。
      • 如果 cur.val 等于 key,直接返回,不插入重复值。
  4. 插入新节点

    • 根据 parent.valkey 的比较结果,将新节点插入到 parent 的左子树或右子树。

        ——这样我们就学会了插入操作了!

        【2】查找操作

        查找操作用于在二叉搜索树中查找特定值。查找过程从根节点开始,根据当前节点的值与目标值的比较结果,决定在左子树还是右子树继续查找。

以下是实现该操作的代码:

public TreeNode search(int key) {// 初始化当前节点为根节点TreeNode cur = root;// 遍历树,直到找到目标节点或遍历到空节点while (cur != null) {if (cur.val < key) { // 当前节点值小于目标值,移动到右子树cur = cur.right;} else if (cur.val > key) { // 当前节点值大于目标值,移动到左子树cur = cur.left;  // 这里应修正为cur = cur.left;} else { // 找到目标节点return cur;}}// 如果没有找到目标节点,返回 nullreturn null;
}

读者可以跟着下面的解释来对上边的代码进行理解:

  1. 初始化当前节点

    • cur 用于遍历树,从 root 开始。
  2. 遍历树

    • cur 不为空时,比较 cur.valkey
      • 如果 cur.val 小于 key,移动到右子树 (cur = cur.right)。
      • 如果 cur.val 大于 key,移动到左子树 (cur = cur.left)。
      • 如果 cur.val 等于 key,返回当前节点。
  3. 返回结果

    • 如果遍历完整棵树没有找到目标节点,返回 null

        【3】删除操作

        删除操作用于从二叉搜索树中删除指定值。删除节点分为三种情况:叶子节点、只有一个子节点的节点和有两个子节点的节点。

        由于删除操作比较哦啊复杂,所以我们这里重点讲解一下,对于删除操作,我们可能会有以下的可能情况:

——现在我们假设待删除结点为 cur, 待删除结点的双亲结点为 parent:

1.cur.left == null

        1. cur 是 root,则 root = cur.right
        2. cur 不是 root,cur 是 parent.left,则 parent.left = cur.right
        3. cur 不是 root,cur 是 parent.right,则 parent.right = cur.right

2.cur.right == null

        1. cur 是 root,则 root = cur.left
        2. cur 不是 root,cur 是 parent.left,则 parent.left = cur.left

        3. cur 不是 root,cur 是 parent.right,则 parent.right = cur.left

3.cur.left != null && cur.right != null

        这时我们就需要使用替换法进行删除,即在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到被删除节点中,再来处理该结点的删除问题

我们大致了解了删除的三种可能的大情况之后,现在让我们尝试着编写一下代码:

public void remove(int key) {TreeNode parent = null; // 父节点初始化为 nullTreeNode cur = root; // 当前节点初始化为根节点// 遍历树,寻找要删除的节点while (cur != null) {if (cur.val < key) { // 当前值小于目标值,移动到右子树parent = cur;cur = cur.right;} else if (cur.val > key) { // 当前值大于目标值,移动到左子树parent = cur;cur = cur.left;} else { // 找到目标节点removeNode(parent, cur); // 调用辅助方法删除节点return; // 删除节点后退出方法}}
}private void removeNode(TreeNode parent, TreeNode cur) {if (cur.right == null) { // 当前节点没有右子树if (cur == root) { // 当前节点是根节点root = root.left; // 根节点指向左子树} else if (parent.left == cur) { // 当前节点是父节点的左子节点parent.left = cur.left; // 父节点左子节点指向当前节点的左子树} else { // 当前节点是父节点的右子节点parent.right = cur.left; // 父节点右子节点指向当前节点的左子树}} else if (cur.left == null) { // 当前节点没有左子树if (cur == root) { // 当前节点是根节点root = root.right; // 根节点指向右子树} else if (parent.left == cur) { // 当前节点是父节点的左子节点parent.left = cur.right; // 父节点左子节点指向当前节点的右子树} else { // 当前节点是父节点的右子节点parent.right = cur.right; // 父节点右子节点指向当前节点的右子树}} else { // 当前节点有两个子节点TreeNode targetParent = cur; // 目标节点的父节点初始化为当前节点TreeNode target = cur.right; // 目标节点初始化为当前节点的右子节点// 寻找右子树中的最左节点while (target.left != null) {targetParent = target;target = target.left;}cur.val = target.val; // 用右子树中最左节点的值替换当前节点的值// 调整指针以删除目标节点if (targetParent.left == target) {targetParent.left = target.right;} else {targetParent.right = target.right;}}
}

——这里我们给每一条代码都加上了注释,读者可以根据注释来对上述代码进行理解!!!

这样我们就了解了二叉搜索树中常用的操作了.

3.二叉树的应用场景

        学习完二叉树的概念以及其基本的使用之后,让我们来学习一些二叉树的应用场景,二叉树(Binary Tree)在日常中有着广泛的应用。以下是一些主要的实际应用场景:

1. 数据结构和算法

  • 二叉搜索树(BST):用于实现高效的搜索、插入和删除操作,时间复杂度平均为 O(log n)。

  • 平衡树(如AVL树、红黑树):这些是自平衡二叉搜索树,确保树的高度保持在 O(log n),从而提供高效的操作。

  • 堆(Heap):二叉堆用于实现优先队列。最大堆用于实现高效的最大值查找,最小堆用于最小值查找。

2. 数据库和文件系统

  • B树和B+树:这些是多路搜索树,常用于数据库索引和文件系统索引,以提高查询和检索的效率。

  • Trie树:一种多叉树,用于实现前缀匹配,常用于字典存储和自动补全功能。

3. 图形和游戏开发

  • 四叉树和八叉树:用于空间分割,以提高碰撞检测、渲染和其他空间查询操作的效率。

  • 场景图(Scene Graph):在3D图形引擎中,场景图是一个树状结构,用于管理和渲染场景中的对象。

这样我们就大致的了解了二叉树在今后的日常中有哪些用武之地了!!!


以上就是本篇文章的主要内容了!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/51649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web基础,http协议,apache概念及nginx

一、web相关概念 Web&#xff0c;全称World Wide Web&#xff0c;通常简称为WWW、Web或万维网&#xff0c;是一个基于超文本和HTTP&#xff08;超文本传输协议&#xff09;的、全球性的、动态交互的、跨平台的分布式图形信息系统。它起源于1989年&#xff0c;由英国科学家蒂姆…

文本编辑三剑客(grep)

目录 正则表达式 元字符 grep 案例 我在编写脚本的时候发现&#xff0c;三个文本编辑的命令&#xff08;grep、sed、awk&#xff0c;被称为文本编辑三剑客&#xff0c;我习惯叫它三巨头&#xff09;用的还挺多的&#xff0c;说实话我一开始学的时候也有些懵&#xff0c;主要…

(史上最全的)Spring6框架学习教程

一、什么是Spring 1.javaWeb框架发展史 1、ServletJSPJavaBean(跳转页面、业务逻辑判断、数据库查询) 2、MVC三层架构(M Model pojo(User)V-view(USP)C-(controller-servlet)) (web-跳转页面service-业务逻辑判断 new UserService0;dao-数据库查询 new UserDao(); ) 3、使用…

二、八、十、十六进制介绍及相互转换

目录 1、引言&#xff1a; 2、进制介绍及区分 2.1 介绍 2.2 区分 2.3 各进制的数字组成 3、2进制与10进制 3.1 十进制的介绍 3.2 二进制的介绍 4、2进制与10进制的转换 4.1 二进制转十进制 4.2 十进制转二进制 5、8进制和16进制 5.1 八进制的介绍 5.2 十六进制的介…

告别抠图烦恼,1秒搞定100张图片背景更换!

想象一下&#xff0c;你手头有几十张甚至上百张证件照需要从白底换成蓝底&#xff0c;而你只能用Photoshop一张张抠图&#xff0c;调整&#xff0c;然后保存。这个过程不仅耗时&#xff0c;还容易出错&#xff0c;特别是当你急需处理大量图片时&#xff0c;简直让人抓狂。 千鹿…

“云+端”体系覆盖590余所学校,张家口如何建设“教育一朵云”?

当将装有小苏打的气球套在装有白醋的塑料瓶瓶口时,一场令人惊叹的化学反应开始上演——瓶内瞬间白雾腾起弥漫,气泡翻滚不息,气球逐渐吹了起来......这是在张家口教育云平台上的由学生及家长上传的关于“小苏打吹气球”的科学实验视频,而学生们与家长参与的便是张家口市中小学云…

昇思MindSpore学习入门-静态图高级编程技巧二

如何优化执行性能 使用jit_class 使用场景&#xff1a;使用jit_class装饰器修饰自定义类&#xff0c;提高执行性能。jit_class应用于静态图模式&#xff0c;在动态图模式下&#xff0c;jit_class会被忽略&#xff0c;不影响动态图模式的执行逻辑。 jit_class的介绍 用户在网…

快递代拿系统/快递代领系统

摘 要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括快递代拿系统的网络应用&#xff0c;在外国快递代拿已经是很普遍的方式&#xff0c;不过国内的快递代拿可能还处于起步阶段。快递代拿系统具有代取物品功能。快递代拿系…

嵌入式学习Day12---C语言提升

目录 一、指针数组 1.1.什么是指针数组 2.2. 格式 2.3.存储 2.4.与字符型二维数组相比 2.5.什么时候使用指针数组 2.6.练习 二、数组指针 2.1.什么是数组指针 2.2.格式 2.3.一维数组 2.3.特点 2.4.什么时候使用 三、指针和数组的关系 3.1.一维数组和指针 …

ps制作镂空文字

1、创建文字。 2&#xff0c;栅格化文字 2、载入选取 3.选择》修改》收缩 4、然后再点击删除键&#xff0c;镂空文字效果就做好了。 同样适用于简单的图片logo

AI智能名片小程序在预测性产品管理与营销中的深度应用探索

摘要&#xff1a;本文深入探讨了AI智能名片小程序在预测性产品管理与营销中的广泛应用及其带来的深远影响。通过详细分析该技术在数据收集、市场分析、用户画像构建、个性化推荐、客户关系管理以及风险预测等方面的具体实践&#xff0c;本文揭示了AI智能名片小程序如何助力企业…

刚起步的小型海外仓有必要上WMS系统吗?答案来了

首先&#xff0c;这里的自动化主要是指将库存管理、SKU管理&#xff0c;一件代发、财务管理等海外仓的日常作业流程通过WMS系统实现的自动化。 而不是指海外仓自动化机器人、智能导轨等硬件设备。 文章会针对刚起步的一些小型海外仓是否有必要使用WMS系统进行讨论&#xff0c…

捷报来袭!上半年HCIE通过120人!证书量总计1767

智汇云校捷报 —上半年华为认证证书量1767本— 2024年上半年&#xff0c;云校HCIA、HCIP、HCIE证书量总计1767本&#xff01; HCIA&#xff1a;1240本 HCIP&#xff1a;407本 HCIE&#xff1a;120本 祝贺以下学员通过HCIE认证&#xff01; 欢迎有考证需求的学员 咨询云校…

Python文件打包exe文件

作者的一点话 你是否还在为py文件无法像其他可视化项目展示出来&#xff0c;制造图形界面的移动使用&#xff0c;那接下来我会与你一同使用它&#xff0c;并进行study&#xff0c;如有困惑&#xff0c;可随时联系。 然后&#xff0c;需要使用pysimplgui&#xff0c;如果…

[网络编程】网络编程的基础使用

系列文章目录 1、 初识网络 网络编程套接字 系列文章目录前言一、TCP和UDP协议的引入二、UDP网络编程1.Java中的UDP2.UDP回显代码案例3.UDP网络编程的注意事项 三、TCP网络编程1.TCP回显代码案例2.TCP多线程使用 总结 前言 在学习完基础的网络知识后&#xff0c;完成跨主机通…

元器件基础学习笔记——二极管基础

一、二极管基础 二极管是用半导体材料(硅、硒、锗等)制成的一种电子器件&#xff0c;具有单向导电性&#xff0c;是现代电子技术的基石。它在电子电路中扮演着至关重要的角色&#xff0c;通过与电阻、电容、电感等元器件的合理连接&#xff0c;能够实现整流、检波、限幅、稳压等…

Midjourney只需输入描述性文本,就能生成栩栩如生的图像

前言 Midjourney 是一款基于人工智能的图像生成工具&#xff0c;由 Midjourney 研究实验室开发。它最初在2022年3月面世&#xff0c;并在同年7月12日开始公开测试。Midjourney 的核心功能是能够根据用户提供的文本提示&#xff08;prompt&#xff09;&#xff0c;利用其内置的…

【软件测试】--接口自动化测试

1. 接口自动化 1.1 概念 接口测试&#xff1a;是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换、传递和控制管理过程&#xff0c;以及相互逻辑依赖关系 自动化测试&#xff1a;是把以人为驱动的测试行为转化为机器执行的一种过程 接口自动化测试&#xff1…

【详细】Ubuntu下安装qt5

Ubuntu下安装qt5 一. QT安装环境准备1、判断gcc是否安装2、安装g3、安装clang编译器4、安装 clang 5、安装make6、安装make-guile7、安装cmake 二. QT5安装1、安装Qt5的组件2、安装Qt的开发工具3、安装qtcreator4、安装qt55、安装qt charts&#xff08;可选&#xff09; 三、安…

国服最强文字转音频?Fish Speech

官网文档与示例 Fish Speech V1.2 是一款领先的文本到语音 (TTS) 模型&#xff0c;使用 30 万小时的英语、中文和日语音频数据进行训练。我尝试用1066运行&#xff0c;但是质量不尽如人意&#xff0c;建议使用RTX系列的显卡进行推理。 使用结果展示 text """20…