用table展示树形结构数据_复习一下数据结构(二)——2.2 树形索引(23树)

        普通树一个结点可以有多个孩子,但它本身只能存储一个元素,而二叉树结点最多只能有两个,这对于元素非常多的时候,会使得树的度或者是高度会非常大。这就使得内存存取外存的次数会增多,一旦涉及到外部存储设备,时间复杂度的计算就会受到影响,所以为了降低对外存设备的访问次数,就引入了一个叫多路查找树(mutil-way search tree)的数据结构。

        多路查找树,其每一个结点的孩子数可以多于两个,且每一个结点可以存储多个元素。多路查找树有查找的性质,所以,所有元素之间又存在着特定的排序关系。多路查找树的4种特殊形式:2-3树、2-3-4树、B树和B+树

        最开始说说最简单的B树,2-3树

        1.1 概念

        2-3树其中的每个非叶子结点都具有两个孩子(2结点)或三个孩子(3结点)。高度为h的2-3树结点数至少有2^h - 1个。

        2结点包含一个元素S和两个孩子(或没有孩子)。元素S大于左子树包含的元素,小于右子树包含的元素。

        3结点包含两个元素S和L以及三个孩子(或没有孩子)。元素S大于左子树包含的元素且小于中间子树包含的元素,元素L大于中间子树包含的元素小于右子树包含的元素。

        且所有叶子结点都在同一层次。

f28811081dc9389d0eba72093c08bafc.png

        1.2 操作2-3树

        1.2.1 查找元素

        2-3树的查找方式与二叉树类似,根据元素与结点的大小比对决定后续路线。如上图,我需要找个10,首先2结点10 > 8,往右子树找;下一结点包含两个元素,为3结点,10 < 12,往左子树找;左子树中比较查找得到10。

e45dca015f4543558d348aaf8717e380.png

9b0752a53ac6cbb263fb3a3ef9053621.png

        1.2.2 插入

        2-3树的插入操作与二叉树相同,插入操作一定是发生在叶子节点上。

        1)对于一个空树来说,插入一个2结点即可

        2)插入结点到一个2结点的叶子上,由于其本身就一个元素,所以只需要将其变成3结点即可。

        如上图,我希望插入一个元素3,根据遍历,3 < 8,3 < 4,于是考虑插入到叶子结点1所在位置,3 > 1,于是3在1的右边儿。

7fa09b978ef599b1fe18e83ff3eb781e.png

        3)往3结点插入一个新元素,就需要将其拆分,且将树中两元素或插入元素的三者中选择其一向上移动一层。

        来看看第一种情况,插入的元素是5,被插入的结点是(6,7),是一个3结点,当父节点是2节点,这时候考虑将567其中一人升一级,4 < 5 < 6, 5 < 6 < 7,将6提上一层,让父节点变为3节点,5插入变成中间子树,剩下一个7为右子树

da2e0264035feb968606a0af2ba9b478.png

        另一种情况,插入的元素是11,11 < 12,显然,11应该插入到3节点(9,10)中,但(9,10)节点不能再插入元素了,于是考虑将11插入到(12,14)节点中,这时候8 < 11 < 12,所以,将12向上提一层,这时候,原来的拥有8元素的2结点变为了3结点,剩下的11,9,10需要考虑将他们变为中子树

14c525a72429ff7f1f11be0772e13e55.png

        1.2.3 删除

        1)所删除的元素位于3结点的叶子结点上直接删除即可。因为3结点中肯定是包含两个元素的,直接删除也不会影响到2-3树的结构变化。如图,我想要把元素9删除,那么我直接剔除元素9即可

f1db89ae502403b36e9cf727dd2cdf72.png

a7de630b102bb8ae48dc58815efae128.png

        2)删除的元素位于2结点上,即删除的是只有一个元素的结点,相当于对结点进行删除操作。这个时候如果直接把结点删除,便会不符合2-3树的定义(无子结点或必须拥有N个子节点)。如,我想要删除元素1,结点4本来是拥有子结点1与子结点6,7的,此时少了结点1,便不符合2-3树的定义了。

b5bc039898f38174ec381b7a615b8137.png

        于是,对于删除的元素处于2结点的位置时候,需要分四种情况考虑:

        第一种,结点双亲也是2结点,且拥有一个3结点的孩子,正如上图,那么这时候只需要左旋,将6元素提上一层即可

4bbae618a7dffb504a66fe708e76684d.png

        第二种,结点的双亲是2结点,右孩子也是2结点。这个时候就不能像上一种情况那样直接左旋,这样会造成新的树形没有右孩子,因此需要对整棵树进行变形,来让拥有7元素的这个结点变为3结点。比如,我删除了一个元素4的结点。这个时候需要让8加入到元素7的结点中,然后让右子树最小的一位元素9到顶层最后左旋即可。

5865228cc775a225e0af86b592affc7c.png

1cd96c5025245205f12ffab0fdcfc506.png

2c710191b8925d8deb31cb40d67d1d14.png

        情形三,此节点的双亲是一个3结点。比如说我删除一个元素10,这个时候只需要将3结点的小元素降下来,然后与中子树的合为一个3结点即可。

6fdedd3c94b7be36b709abe990172d2a.png

        情形四,当前的2-3树为一个满二叉树,这个时候,删除任何一个叶子都需要让整棵树变形。我从下图中删除一个8元素的结点,这个时候9肯定不能单独作为一个2结点存在了,考虑到2-3树的性质,6与7合为一个3结点,放左子树,14提上一层,13当做一个中子树,15作为一个右子树

c5d96945b81b36cc4bcbe6fceeb301f5.png

d2f4b4f3677ca593fbf51648224d197b.png

99cbd2b15c48c75102029d30c93a99ce.png

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

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

相关文章

Spring中整合mybatis包

一、把对应的依赖都添加上&#xff1a; mysql、mybatis、spring的依赖&#xff08;都是基础的&#xff09; <dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.17<…

dfa转正则表达式_从0到1打造正则表达式执行引擎(二)

本文原文地址https://blog.csdn.net/xindoo/article/details/106458165在上篇博客从0到1打造正则表达式执行引擎(一)中我们已经构建了一个可用的正则表达式引擎&#xff0c;相关源码见https://github.com/xindoo/regex&#xff0c;但上文中只是用到了NFA&#xff0c;NFA的引擎建…

AOP的学习

注意&#xff1a;不惊动原始设计 一、部署依赖 AOP开发默认导入 <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version></dependency> 二、具体步骤 Aspect 告诉Sprin…

选择题_一级造价师选择题的分值是多少

一级造价工程师考试的选择题分为单选题和多选题&#xff0c;每科单选题为60题&#xff0c;每题一分&#xff1b;多选题为20题&#xff0c;每题两分&#xff0c;总分100分。一级造价师选择题的分值一级造价工程师考试共有《建设工程造价管理》、《建设工程计价》、《建设工程技术…

2017年什么命_所谓“佛系”,真的不是什么都不做!

文 | 新宇姐姐 猫咪de生活观在这匆忙的世道中&#xff0c;人心浮躁&#xff0c;急不可耐。这喧嚣的世界车水马龙&#xff0c;我们为了生活&#xff0c;三点一线的忙碌奔波。城市很繁华&#xff0c;容易让人迷失&#xff1b;尘世很奔波&#xff0c;容易让人疲倦。不由得让我们想…

flask 接口 让别人能访问_flask搭建一个前后端分离的系统

我们通常说三端&#xff0c;pc端&#xff0c;android端和ios端。如果前后端不分离&#xff0c;相当是要做三套系统。如果前后端分离的话&#xff0c;可以共用一个后端&#xff0c;前端各自做自己的&#xff0c;不用管后端。前后端不分离在前后端不分离的应用模式中&#xff0c;…

SpringMVC下5中参数类型传递

1、普通参数 //普通参数:请求参数名与形参名不同RequestMapping("/commonParamDifferentName")ResponseBodypublic String commonParamDifferentName(RequestParam("name") String username, int age){System.out.println("普通参数传递:username:&qu…

centos 没有nmtui命令_Linux free 命令

在Linux/Unix 系统上&#xff0c;free是一个很受系统管理员欢迎的命令&#xff0c;它是一个功能强大的工具&#xff0c;他能以一种易读的方式把内存使用情况展示出来free 展示了系统中空闲和已经使用了的物理内存、交换内存以及内核的缓冲区和页面缓存&#xff0c;所有展示的信…

spring中注解来创建bean

一、 核心配置文件中的组件来扫描对应包下面的所有类来匹配。 当我们使用ApplicationContext实例化的对象调用getBean函数获取bean的时候&#xff0c;内部时根据Component内的值来确定创建哪个对象&#xff1a; Component中的值就类似之前bean配置中id的作用一样。 二、纯注解…

django设置超级管理员_Django的简介与安装

Django的简介与安装Django 是用 Python 开发的一个免费开源的 Web 框架&#xff0c;可以用来快速搭建优雅的高性能网站。它采用的是“MVC”的框架模式&#xff0c;即模型 M、视图 V 和控制器 C。 Django 最大的特色&#xff0c;在于将网页和数据库中复杂的关系&#xff0c;转化…

SpringMVC的准备工作

一、 先通过Maven创建一个webapp项目 创建完成之后在pom文件中设置一些基本的信息&#xff1a; 1、打包方式 <packaging>war</packaging> 以war包的形式打包 2、相关依赖 现阶段只有3个&#xff1a;SpringMVC、thymeleaf与Spring整合、ServletAPI <dependencie…

请领导批阅文件怎么说_领导说“谢谢”,该怎么回?低情商才说不客气,高情商的都这样说!...

职场中&#xff0c;当我们顺手帮了领导个小忙或者领导跟我们要工作资料&#xff0c;我们发给领导的时候&#xff0c;领导可能会顺口说“收到&#xff0c;谢谢”&#xff0c;这样的时候&#xff0c;其实领导就是表示收到了。我们如何回复&#xff0c;才不至于失了礼貌&#xff0…

vue的简单学习

vue和thymeleaf &#xff1a; 若先显示框架后加载数据则用vue 若后端处理好之后发送给前端页面显示用thymeleaf (弹幕) 对于前后端分离的认识&#xff1a; 使用vue 将前端页面、框架等建立好&#xff0c;只需要后端发送数据即可 但thymeleaf就需要在服务器启动之前将数据保存到…