c++(树)

news2024/11/22 16:20:05

定义

2-3 树中的每一个节点都有两个孩子(称为 2 节点,2-node)或三个孩子(称为 3 节点,3-node)。

  • 2 节点,有一个数据元素和两个孩子。只能有两个孩子或没有孩子,不能出现只有一个孩子的情况。如果 2 节点有孩子,左子树包含的元素小于 ,右子树包含的元素大于 

  • 3 节点,有两个数据元素和三个孩子。只能有三个孩子或没有孩子,不能出现有一个孩子或有两个孩子的情况。如果 3 节点有孩子,左子树包含小于较小元素的元素,右子树包含大于较大元素的元素,中间子树包含介于两元素之间的元素。

  • 4 节点,有三个数据元素。只会在操作树时暂时创建,而不会永久存储在树上。

2-3 树的叶节点不含有子节点,有一个或两个数据元素。

树  是一个 2-3 树,当且仅当以下表述之一成立:

  1.  是空树。
  2.  是一个 2 节点,并带有元素 。如果  有左孩子  和右孩子 ,则:
    •  和  是相同高度的 2-3 树。
    •  大于  中的每个元素。
    •  小于  中的每个数据元素。
  3.  是一个 3 节点,并带有数据元素  和 ,其中  小于 。如果  有左孩子 ,中间孩子  和右孩子 ,则:
    •  和  是相等高度的 2-3 树。
    •  大于  中的每个数据元素且小于  中的每个数据元素。
    •  大于  中的每个数据元素且小于  中的每个数据元素。

性质

  • 所有内部节点都是 2 节点或 3 节点。
  • 所有叶节点都在同一层级上。
  • 树上的所有数据都是按顺序保存的(多路搜索树的性质)。

操作

查找

由于 2-3 树上的元素是按一定顺序存储的,所以 2-3 树的查找与二叉搜索树类似。下面在树  中查找元素 

  1. 如果 2–3 树  为空,那么  肯定不在  中,查找结束。
  2. 假设  是  的根节点。
  3. 如果  是一个叶子节点:
    • 如果  不在节点  中,那么  肯定不在整个树  中,查找结束。
    • 如果  在节点  中,那么  在树  中,查找成功结束。
  4. 假设  是一个 "2 节点",具有左子节点  和右子节点  是节点  中的数据元素。有以下三种情况:
    • 如果  等于 ,那么找到  在树  中,查找成功结束。
    • 如果  小于 ,将  设为子树 ,并回到步骤 2 继续查找。
    • 如果  大于 ,将  设为子树 ,并回到步骤 2 继续查找。
  5. 假设  是一个 "3 节点",具有左子节点 、中间子节点  和右子节点  和  是节点  中的两个数据元素,满足 。有以下四种情况:
    • 如果  等于  或 ,那么找到  在树  中,查找成功结束。
    • 如果  小于 ,将  设为子树 ,回到步骤 2 继续查找。
    • 如果  在  和  之间,将  设为子树 ,回到步骤 2 继续查找。
    • 如果  大于 ,将  设为子树 ,回到步骤 2 继续查找。

插入

插入节点需要维持树的平衡。

对于空树,直接插入一个 2 节点即可。此外,为了保持完美平衡性,向 2-3 树添加元素不会直接添加到空节点,而是先进行搜索,将待插入元素添加到最后搜索到的叶子节点,与它融合。

  1. 如果插入 2 节点,则融合形成 3 节点。如下图插入元素 4。

  2. 如果插入 3 节点,则先融合形成 4 节点,再拆解形成 2 个 2 节点。

    • 如果父节点为 2 节点,则中间元素上移与父节点融合形成 3 节点。如下图插入元素 10。

    • 如果父节点为 3 节点,则重复步骤 2。如下图插入元素 1。

通过上述深度增加的例子,可以看出 2-3 树和标准二叉树不同,标准的二叉树的的深度是由上到下的增加的,而 2-3 树的深度是由下至上的增加的。

删除

删除节点需要维持树的平衡。2-3 树的删除可以分为三种情况。

  1. 待删除元素位于一个 3 节点的叶子节点上。只需要在该节点处删除该元素即可,不会影响到整棵树的其他节点结构。
  1. 待删除的元素位于非叶子的分支节点。通常先按中序遍历后得到此元素的前驱或后继元素,让他们来补位,再删除用于补位的前驱或后继元素。如果我们要删除的分支节点是 2 节点,如上下图所示,待删除的元素是 4,前驱是 1,后继是 6,显然 , 是 3 节点,只需要用 6 来补位即可。这里就不讲解删除的分支节点是 3 节点的情况了,与上述类似。

3. 所删除的元素位于一个 2 节点上。如果删除一个 2 节点,很有可能造成 2-3 树平衡破坏的情况,因为对于每一个 2 节点,要么有两个子树要么没有,对于每一个 3 节点要么有三个子树要么没有,贸然删除一个 2 节点,很可能出现平衡遭到破坏,所以我们需要分情况讨论。

  1. 此节点的父亲节点是 2 节点,兄弟节点是 3 节点。将父亲节点移动到当前位置,再将兄弟节点中最接近当前位置的元素移动到父亲节点中。如下图所示,待删除元素为 1。

  2. 此节点的父亲节点是 2 节点,兄弟节点也是 2 节点。先通过移动兄弟节点中序遍历的直接后驱到兄弟节点,使兄弟节点变为 3 节点,再进行上述 3.1 的操作。如下图所示,待删除元素为 4,如果直接执行上述 3.1 的操作会造成没有右孩子,因此需要对整棵树变形。通过移动兄弟节点 7 中序遍历的直接后驱 8 到兄弟节点,让节点 7 变成 3 节点,再让比 8 大的 9 补充到 8 的位置,最后再执行上述 3.1 的操作。

  3. 此节点的父亲节点是 3 节点。拆分父亲节点使其成为 2 节点,再将父亲节点中最接近删除元素的元素与中孩子合并,将合并后的节点作为当前节点。如下图所示,待删除元素为 10。

  4. 当前 2-3 树是一个满二叉树。将 2-3 树的层数减少,并将兄弟节点合并到父亲节点中,同时将父亲节点的所有兄弟节点合并到父亲节点的父亲节点中,如果生成了 4 节点,再分解 4 节点即可。

并行操作(Parallel operations)

由于 2-3 树在结构上与红黑树相似,因此红黑树的并行算法也可以应用于 2-3 树。

2-3 树和左偏红黑树

2-3 树和左偏红黑树实质是等价的。2-3 树中一个节点可以存储 1 个元素或 2 个元素,而红黑树的一个节点只能存储一个元素。如下图所示,2-3 树的 2 节点对应一个黑色节点,3 节点对应一个红色节点和一个黑色节点(可以将 bc 视作平行)。

下图是一棵 2-3 树对应的左偏红黑树。

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

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

相关文章

JVM学习总结:字节码篇

本文是学习尚硅谷宋红康老师主讲的 尚硅谷JVM精讲与GC调优教程 的总结 ,部分内容也参考了 JavaGuide 网站(文末有链接) JVM 概述 Oracle JDK 与 OpenJDK 是什么关系? 2006 年 SUN 公司将 Java 开源,也就有了 OpenJDK。…

【verilog】四位全加器

文章目录 前言一、实验原理二、实验过程三、实验结果参考文献 前言 进行 FPGA 全加器 实验 一、实验原理 module adder(ain,bin,cin,cout,s); input ain,bin,cin; output cout,s; assign coutain&bin | ain&cin | bin&cin; assign sain^bin^cin; endmoduletimesc…

复杂类型map与struct

1.map:Key-Value 型数据格式 建表: create table myhive.test_map( id int, name string, members map<string,string>, age int) row format delimited fields terminated by , COLLECTION ITEMS TERMINATED BY # MAP KEYS TERMINATED BY :; 数据导入:load data local …

基于ssm+jsp的地方疫情管理系统(含源码+数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: apache tomcat 主要技术: Java,Spring,SpringMvc,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统包含两个…

「二叉树进阶题解:构建、遍历与结构转化全解析」

文章目录 根据二叉树创建字符串思路代码 二叉树的层序遍历思路代码 二叉树的最近公共祖先思路代码 二叉搜索树与双向链表思路代码 从前序与中序遍历序列构造二叉树思路代码 总结 根据二叉树创建字符串 题目&#xff1a; 样例&#xff1a; 可以看见&#xff0c;唯一特殊的就…

Fast Simulation of Mass-Spring Systems in Rust 论文阅读

参考资料&#xff1a; Fast Simulation of Mass-Spring Systems in Rust 论文阅读&#xff1a;Fast Simulation of Mass-Spring Systems 【论文精读】讲解刘天添2013年的fast simulation of mass spring system(Projective Dynamics最早的论文) Projective Dynamics笔记(一…

新手做私域学会这三步,一周时间营收翻倍

在数字化营销的时代&#xff0c;私域流量的运营已经成为品牌和创业者提升营收的关键。如果你是一个私域营销的新手&#xff0c;那么这篇文章将是你的福音。我们将分享三个简单而有效的步骤&#xff0c;帮助你在短短一周内实现营收翻倍的目标。 第一步&#xff1a;明确人设——…

SpringBoot项目整合Knife4J

SpringBoot项目整合Knife4J 前言为什么要使用API文档什么是API文档 Knife4jKnife4j的进化史Swagger和Knife4J的关系 SpringBoot整合Knife4j版本适配实现步骤1.导入依赖2.编写配置类新建一个controller进行测试启动项目 Knife4j增强配置常用注解例子展示实体类注解Controller注解…

【大数据学习 | kafka】kafuka的基础架构

1. kafka是什么 Kafka是由LinkedIn开发的一个分布式的消息队列。它是一款开源的、轻量级的、分布式、可分区和具有复制备份的&#xff08;Replicated&#xff09;、基于ZooKeeper的协调管理的分布式流平台的功能强大的消息系统。与传统的消息系统相比&#xff0c;KafKa能够很好…

HarmonyOS 相对布局(RelativeContainer)

1. HarmonyOS 相对布局&#xff08;RelativeContainer&#xff09; 文档中心:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-layout-development-relative-layout-V5   RelativeContainer为采用相对布局的容器&#xff0c;支持容器内部的子元素设…

海螺 2.27.1 |AI生成视频 AI音乐 语音通话

嗨&#xff01;我是小海螺&#xff0c;你的AI智能伙伴&#xff0c;帮助你学习工作效率加倍&#xff01;我无所不知&#xff0c;又像朋友陪你左右&#xff0c;遇到问题&#xff0c;就问我吧。我所使用的技术&#xff0c;是MiniMax公司自研的万亿参数MoE大模型。我们希望能与用户…

【SpringCloud】Seata微服务事务

Seata微服务事务 分布式事务问题&#xff1a;本地事务分布式事务演示分布式事务问题&#xff1a;示例1 分布式事务理论CAP定理一致性可用性分区容错矛盾 Base理论解决分布式事务的思路 初识SeataSeata的架构部署TC服务微服务集成Seata引入依赖配置TC地址 其他服务 动手实践XA模…

WRB Hidden Gap,WRB隐藏缺口,MetaTrader 免费公式!(指标教程)

WRB Hidden Gap MetaTrader 指标用于检测和标记宽范围的柱体&#xff08;非常长的柱体&#xff09;或宽范围的烛身&#xff08;具有非常长实体的阴阳烛&#xff09;。此指标可以识别WRB中的隐藏跳空&#xff0c;并区分显示已填补和未填补的隐藏跳空&#xff0c;方便用户一眼识别…

Zustand介绍与使用 React状态管理工具

文章目录 前言基本使用编写状态加方法在组件中使用异步方法操作 中间件简化状态获取优化性能 持久化保存 前言 在现代前端开发中&#xff0c;状态管理一直是一个关键的挑战。随着应用规模的扩大&#xff0c;组件间的状态共享变得愈加复杂。为了应对这一需求&#xff0c;开发者…

Java-图书管理系统

我的个人主页 欢迎来到我的Java图书管理系统&#xff0c;接下来让我们一同探索如何书写图书管理系统吧&#xff01; 1管理端和用户端 2建立相关的三个包&#xff08;book、operation、user&#xff09; 3建立程序入口Main类 4程序运行 1.首先图书馆管理系统分为管理员端和…

使用Poste搭建内网邮件服务器

使用Poste搭建内网邮件服务器 Poste.io 也是一个流行的邮件服务器方案&#xff0c;它可以通过 Docker 容器轻松部署&#xff0c;非常适合搭建内部邮件服务器。 本文档将向您展示如何开始使用 Poste.io 邮件服务器。在 5 分钟内&#xff0c;您将拥有一个可发送和接收邮件的邮件…

Springboot 使用EasyExcel导出Excel文件

Springboot 使用EasyExcel导出Excel文件 Excel导出系列目录&#xff1a;引入依赖创建导出模板类创建图片转化器 逻辑处理controllerservice 导出效果遗留问题 Excel导出系列目录&#xff1a; 【Springboot 使用EasyExcel导出Excel文件】 【Springboot 使用POI导出Excel文件】 …

基于Python大数据的王者荣耀战队数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

es实现自动补全

目录 自动补全 拼音分词器 安装拼音分词器 第一步&#xff1a;下载zip包&#xff0c;并解压缩 第二步&#xff1a;去docker找到es-plugins数据卷挂载的位置&#xff0c;并进入这个目录 第三步&#xff1a;把拼音分词器的安装包拖到这个目录下 第四步&#xff1a;重启es 第…

使用freemarker实现在线展示文档功能开发,包括数据填充

首先&#xff0c;在这个独属于程序员节日的这一天&#xff0c;祝大家节日快乐【求职的能找到心仪的工作&#xff0c;已经工作的工资翻倍】。 ---------------------------------------------------------------回到正文-----------------------------------------------------…