Q1: 什么是2-3-4树?

A1:在介绍2-3-4树之前,我们先说明二叉树和多叉树的概念。

二叉树:每个节点有一个数据项,最多有两个子节点。

多叉树:(multiway tree)允许每个节点有更多的数据项和更多的子节点。在多叉树中,节点的数据项是按关键字升序排列。

A1:2-3-4树就是多叉树,它的每个节点最多有3个数据项和4个子节点。

2-3-4树中的2、3、4的含义是指一个节点可能包含的子节点的个数。

对非叶节点有三种可能的情况:

1) 有1个数据项的节点总是有2个子节点

2) 有2个数据项的节点总是有3个子节点

3) 有3个数据项的节点总是有4子节点

简而言之,非叶节点的子节点数总是比它含有的数据项多1。

L = D + 1

设L是子节点链接的个数,D是数据项的个数。

比较来说,叶节点没有子节点,然而它可能还有1个、2个或3个数据项。空节点是不会存在的。

所有的叶节点都在同一层上。

Q2: 为什么不称2-3-4树为1-2-3-4树呢? 它的节点不能像二叉树那样只有一个节点吗?

A2:二叉树中,节点最多有两个子节点的链接。它当然可以只有一个链接,指向它的左子节点或右子节点。它的另一个链接可以是一个NULL值。

然而,在2-3-4树中,不允许只有一个链接,有一个数据项的非叶节点必须总是保持有两个链接,除非它是叶节点,但是在那种情况下会没有链接。

Q3: 如何组织2-3-4树?

A3:为了方便起见,用从0到2的数字给数据项编号,用0到3给子节点编号。如下图:

有两个链接的节点称为2-节点,有三个链接的称为3-节点,有四个链接的称为4-节点,但没有称为1-节点的节点。

节点中的数据项是按关键字升序排列,习惯上从左到右升序。

A3:2-3-4树的规则:

1) 根是child0的子树的所有子节点的关键字K < key0

2) 根是child1的子树的所有子节点的关键字key0 < K < key1

3) 根是child2的子树的所有子节点的关键字key1 < K < key2

4) 根是child3的子树的所有子节点的关键字K > key2

2-3-4树一般不允许出现重复关键字值

Q4: 如何实现2-3-4树的Java代码?

A4:完整代码见https://gitee.com/firewaycoding/ds_in_java/blob/master/chapter10/01Tree234/src/Tree234.java

Q5: 单元测试用例应该覆盖哪些场景?

A5:插入和查找。

Q6: 插入操作?

A6:以插入[194, 210, 130, 142, 226, 34, 74, 178, 46, 38, 170, 98, 218, 278, 70, 118, 146, 174, 114, 106, 50, 158, 282, 138, 90, 266, 274, 78, 86, 94, 214, 242]为示例。

从上面我们可以总结出以下几点:

1) 新的数据项总是插在叶节点里,在树的最底层;

2) 查找时没有碰到满节点,插入很简单,找到合适的叶节点后,只要把新数据项插入进去就可以;

3) 如果往下寻找要插入的路途中,遇到满节点,需要节点先分裂,正如上图插入第17个元素,第21个元素,好好体味节点分裂和根节点分裂的细微差异;

4) 注意节点分裂是把数据向上和向右移动,正是这样的重新排列才保持了树的平衡

Q7: 怎样把2-3-4树转化为红黑树?

A7:有3条规则:

1) 把2-3-4树中的每个2-节点转化为红黑树的黑节点;

2) 把每个3-节点转化为一个子节点和父节点,哪个节点变成子节点或父节点都无所谓。子节点涂成红色,父节点涂成黑色;

3) 把每个4-节点转化为一个父节点和两个子节点。子节点涂成红色,父节点涂成黑色;

下面展示了一棵2-3-4树和应用这些规则转化后的红黑树。

Q8: 如何证明2-3-4树的分裂与红黑树的颜色变换、旋转的等价性?

A8: 2-3-4树中用节点分裂保持平衡,红-黑树中用颜色变换和旋转保持平衡。

1) 4-节点分裂和颜色变换

2) 3-节点分裂和旋转

有两种可能的排列方式。主要是以3-节点的两个数据项中的哪个作为父节点。

注意,左倾旋转得来的树和右倾的树是一样的。因此红-黑树的旋转和把2-3-4树转换为红-黑树时选择哪个节点做父节点是等价的。

Q8: 2-3-4树的效率

A:在时间方面,树的搜索时间与树的层数成正比,特别的是,2-3-4树中的每个节点最多可以有4个子节点,如果每个节点都是满的,树的高度应该和Log4N成正比。不过它们不可能是满的,因此,2-3-4树的的高度大致在(Log2(N + 1)) / 2和Log2(N + 1)之间。

另一方面,因为节点用线性搜索来查看数据项,也消耗一点时间,有些节点有一个数据项,有些有两个,有些有三个,如果按平均两个来计算,查找的时间和2 * Log4成正比。在大O表示法中这个小的常数可以忽略。

因此,2-3-4树中的查找时间与平衡二叉树如红-黑树大致相等,都是O(logN)。

A:在空间方面,2-3-4树每个节点保存三个数据项的引用和四个子节点的引用,这些空间可以用数组的方式来分配。可能会想到用链表来代替数组,但对只有三个或四个数据项来说,链表的额外开销和数组比起来,用链表也许不是一个很好的方法。

不过,使用数组的方式,大约有2/7的可用空间浪费了。怎么说呢? 比如只有一个数据项的节点会浪费2/3的数据项存储空间和1/2的子节点存储空间,两个数据项的节点会浪费1/3的数据项存储空间和1/4的子节点存储空间,如果按每个节点有两个数据项来计算,大约就有2/7的存储空间浪费。

参考资料

《Java数据结构和算法》第2版第10章2-3-4树

内容来源于网络如有侵权请私信删除

java 树什么意思是什么意思是什么_Java数据结构和算法 - 什么是2-3-4树相关推荐

  1. Java实现自定义队列和树结构_Java数据结构之链表、栈、队列、树的实现方法示例...

    本文实例讲述了java数据结构之链表.栈.队列.树的实现方法.分享给大家供大家参考,具体如下: 最近无意中翻到一本书,闲来无事写几行代码,实现几种常用的数据结构,以备后查. 一.线性表(链表) 1.节 ...

  2. java树的基本知识_Java数据结构和算法(二)树的基本操作

    Java数据结构和算法(二)树的基本操作 一.树的遍历 二叉树遍历分为:前序遍历.中序遍历.后序遍历.即父结点的访问顺序 1.1 前序遍历 基本思想:先访问根结点,再先序遍历左子树,最后再先序遍历右子 ...

  3. java数据结构 队列_Java数据结构与算法[原创]——队列

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本文介绍数据结构中的队列(queue)的概念.存储结构.队列的特点,文末给出ja ...

  4. 对分查找的最多次数_Java数据结构与算法:多路查找树

    作者:subeiLYhttps://blog.csdn.net/m0_46153949/article/details/106742330 本章思维导图 二叉树与B树 二叉树的问题分析二叉树的操作效率 ...

  5. java数据结构排序实验报告_java数据结构与算法之插入排序详解

    本文实例讲述了java数据结构与算法之插入排序.分享给大家供大家参考,具体如下: 复习之余,就将数据结构中关于排序的这块知识点整理了一下,写下来是想与更多的人分享,最关键的是做一备份,为方便以后查阅. ...

  6. 【数据结构与算法基础】哈夫曼树与哈夫曼编码(C++)

    前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...

  7. js遍历树节点下的所有子节点_【数据结构与算法】(3)——树和二叉树

    树 树的基本概念 树是一种非线性的数据结构,样子如图所示: 树的主要特点是树中的数据是分层存储的,每个元素称为树的节点,最顶层有且只有一个元素,称为根节点,其余层可以有任意数量的节点.除了根节点,其余 ...

  8. java stack 从1.5开始?_java数据结构与算法之栈(Stack)设计与实现

    本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 栈是一种用于存储数据的简单数据结构,有点类似链表或者顺序表(统称线性表),栈与线 ...

  9. java快排原理_Java数据结构与算法——快速排序

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本篇文章介绍排序算法中最常用也是面试中最容易考到的排序算法--快排,包括快排的思 ...

  10. java架构师进阶独孤九剑系列(一):数据结构与算法

    " 架构师进阶系列之独孤九剑,这套秘籍如果你能完整学会,年薪至少60万起,今天是架构师进阶连载开启篇. Java程序员成长为架构师进阶步骤 未来我会用1-2个月在实战为大家讲解架构师的九大必 ...

最新文章

  1. linux shell 使用代理 proxychains 简介
  2. mysql自动dump脚本_MySQL--简单mysqldump脚本
  3. php gpg,使用 gpg 验证 php
  4. gradle拷贝静态资源文件_Gradle复制文件/目录方法
  5. OpenCASCADE 开发框架(一)
  6. 威联通 Qnap PK 群晖 Synology 安全篇3
  7. 肠道微生物群与过敏性鼻炎
  8. 代理服务之反向代理(反向加速代理)
  9. 支付宝app支付功能-服务端的实现-python3版
  10. 图片转DATA:URI工具
  11. 【数学】均匀分布生成其他分布的方法
  12. 沐神的 《动手学深度学习》 课程中的 3.2节 线性回归的从零实现
  13. 第十讲:如何去改变 第十一讲:改变——养成良好习惯 第十二讲:改变设定目标
  14. 大眼锁定,PMP考点+PMBOK知识点梳理
  15. 因为这份简历,我拿到了阿里的offer!
  16. 微软hackathon总结
  17. rndc: connect failed: 127.0.0.1#953: connection refused
  18. 数据库原理 数据库镜像
  19. iOS 获取IP地址
  20. 蹲在ICU的门口,我看到了死亡的样子

热门文章

  1. WPS打不出英文引号
  2. 十五. Go学习:goroute和cahnnel
  3. 苹果的产品开发流程介绍:带你认识世界最好的设计公司
  4. 如何在淘宝上利用信息差赚钱
  5. 认识IL代码---从开始到现在 第二篇
  6. 计算机Wor表格制作斜线表头,Word文档里怎么画表格斜线表头
  7. ROS导航仿真操作(3)
  8. Windows之——pid为4的system进程占用80端口的解决办法
  9. js设置禁止浏览器刷新,右键和F5键
  10. 地形剖面matlab,基于MATLAB河道横断面绘制.doc