定义:234树是扩展于二叉树的多叉树,二叉树是一个数据项,两个子节点,234树是最少一个数据项,最多3个数据项,最少2个子节点,最多4个子节点,也就是说234树当只有一个数据项时非叶子节点有且只有2个子节点,2个数据项时3个子节点,3个数据项时4个子节点,子节点数量可以为234,所以叫234树。

运算限制:它是平衡树,有序树,添加操作只发生在叶子节点上。

看上图,第一个节点有一个数据项70,两个子节点(节点2,节点3),节点2以及他的子节点的所有数据小于70,节点3以及他的子节点的数据大于70。第二个节点有两个数据项22,40,三个子节点(4,5,6),节点4的数据小于22,节点5的数据大于22小于40,节点6的数据大于40。到这里基本了解什么是234树了。

那下面一步步看吧。

实例化一个234树对象

实际上是实例化一个node对象,作为树的跟节点,在看node类定义

一个node就是一个节点,一个节点包括:

1,childArray,长度为4的子节点数组,也就是最多4个子节点。

2,itemArray,长度为3的数据项数组,也就是最多3个数据项。

3,parent,父节点。

4,numItems,节点内数据项个数,也就是数据项数组内存在的数据项个数。

再看数据项类定义:

1,data,数据项数据。

2,status,数据是否有效,1有效,0无效。

好,下面就可以操作数据了。

插入

如果查找过程中直到叶子结点都没有遇到满数据项节点就直接插入到叶子节点,如果遇到满节点则分裂这个满节点,然后继续获取子节点查找,直到叶子节点,跳出循环,插入到叶子节点。

满节点分裂过程:满节点即存在三个数据项的节点,假如分别称为123,那么分裂为该节点保留1数据项,2数据项放到父节点适当位置,此时父节点增加了一个数据项,必然也要增加一个子节点,3数据项就是放到父节点新增的子节点中。同时满节点原本存在4个子节点,分裂后只有1个数据项也就只能保留2个子节点,靠右的另两个子节点应连接到新增节点上。

如果插入时满节点是根节点,同样的操作,只不过它不存在父节点,所以新建根节点,把原根节点作为新根节点的子节点。

查找

查找就不用多说了 ,就是一个节点一个节点的找,由于234树是有序的,所以查找跟二叉树很像,速度很快。

删除

先找到数据项,找到了修改数据项的状态为无效就可以了。

public class Tree234 {private Node root = new Node();public void insert(long value){Node curNode = root ;DataItem item = new DataItem();item.data = value ;item.status = 1 ;while(true){if(curNode.findItem(value)!=null ){curNode.findItem(value).status = 1 ;return ;}else if(curNode.isFull()){split(curNode);curNode = curNode.getParent();curNode = getNextChild(curNode,value);}else if(curNode.isLeaf()){break;}else{curNode = getNextChild(curNode,value);}}curNode.insertItem(item);}/*** @param node* @param value* @return*/private Node getNextChild(Node node, long value) {int j ;int numItems = node.getNumItems();for(j=0;j<numItems;j++){if(value<node.getItem(j).data){return node.getChild(j);}}return node.getChild(j);}private void split(Node node){DataItem itemB,itemC;Node parent,child2,child3;int itemIndex;itemC = node.removeArgestItem();itemB = node.removeArgestItem();child2 = node.disconnectChild(2);child3 = node.disconnectChild(3);Node newRight = new Node();if(node==root){root = new Node();parent = root ;root.connectChild(0, node);}else{parent = node.getParent();}itemIndex = parent.insertItem(itemB);int n = parent.getNumItems();for(int j=n-1;j>itemIndex;j--){Node temp = parent.disconnectChild(j);parent.connectChild(j+1, temp);}parent.connectChild(itemIndex+1, newRight);newRight.insertItem(itemC);newRight.connectChild(0, child2);newRight.connectChild(1, child3);}public boolean find(long value){Node curNode = root;DataItem index;while(true){if((index=curNode.findItem(value))!=null){return index.status==1;}else if(curNode.isLeaf()){return false;}else{curNode = getNextChild(curNode, value);}}}public boolean remove(long value){Node curNode = root;DataItem index;while(true){if((index=curNode.findItem(value))!=null){boolean remove = (index.status==1) ;index.status = 0;return remove;}else if(curNode.isLeaf()){return false;}else{curNode = getNextChild(curNode, value);}}}static class DataItem{long data ;//数据项数据int status ;//是否是有限数据,1有限public void displayItem(){System.out.print("/"+data);}}static class Node{private static final int ORDER = 4 ;//子节点数组的长度,最多4个子节点private int numItems ;//节点内数据项的个数private Node parent ;//父节点private Node[] childArray = new Node[ORDER];//子节点数组private DataItem[] itemArray = new DataItem[ORDER-1];//节点数据项数组,最多3个数据项public void connectChild(int childNum ,Node child){childArray[childNum] = child;if(child!=null){child.parent = this;}    }public Node disconnectChild(int childNum){Node childNode = childArray[childNum];childArray[childNum] = null ;return childNode ;}public Node getChild(int childNum){return childArray[childNum] ;}public Node getParent(){return parent ;};public boolean isLeaf(){return (childArray[0]==null)?true:false;}public int getNumItems() {return numItems;}public DataItem getItem(int index){return itemArray[index];}public boolean isFull(){return (numItems==ORDER-1)?true:false ;}public DataItem findItem(long value){for(int j=0;j<ORDER-1;j++){if(itemArray[j]==null){break;}else if(itemArray[j].data == value){return itemArray[j];}}return null;}public int insertItem(DataItem item){numItems ++ ;long newvalue = item.data ;for(int j=ORDER-2;j>=0;j--){if(itemArray[j]==null){continue;}else{long thisvalue = itemArray[j].data;if(newvalue<thisvalue){itemArray[j+1] = itemArray[j];}else{itemArray[j+1] = item;return j+1;}}}itemArray[0] = item;return 0 ;}public DataItem removeArgestItem(){DataItem item = itemArray[numItems-1] ;itemArray[numItems-1] = null ;numItems--;return item;}public void displayNode(){for(int i =0;i<numItems;i++){itemArray[i].displayItem();}System.out.println("/");}}public static void main(String[] args) {Tree234 tree234 = new Tree234();tree234.insert(20);tree234.insert(60);tree234.insert(40);tree234.insert(70);tree234.insert(220);tree234.insert(290);tree234.insert(280);tree234.insert(200);tree234.insert(30);tree234.insert(22);tree234.insert(23);Node root = tree234.root;root.displayNode();for(int j=0;j<root.numItems+1;j++){root.getChild(j).displayNode();for(int i=0;i<root.getChild(j).getNumItems()+1;i++){if(root.getChild(j).getChild(i)!=null){root.getChild(j).getChild(i).displayNode();}}}System.out.println(tree234.find(23));System.out.println(tree234.remove(23));System.out.println(tree234.find(23));tree234.insert(23);System.out.println(tree234.find(23));}
}

运行结果

/70/
/22/40/
/20/
/23/30/
/60/
/280/
/200/220/
/290/

【数据结构与算法08】234树相关推荐

  1. 数据结构与算法之2-3-4树

    数据结构与算法之2-3-4树 原文来自个人博客(求访问/关注/收藏): https://bbing.com.cn/ CSDN个人博客不定期转载 平衡树 [外链图片转存失败,源站可能有防盗链机制,建议将 ...

  2. Java数据结构和算法:234树和外部存储

    234树 有一个数据项的节点总是有两个子节点 有两个数据项的节点总是有三个子节点 有三个数据项的节点总是有四个子节点 多叉树,四叉树 外部存储 主存RAM,随机访问存储器,断电后数据会丢失 磁盘文件存 ...

  3. 『数据结构与算法』解读树(Tree)和二叉树(Binary Tree)!

    『数据结构与算法』解读树(Tree)和二叉树(Binary Tree)! 文章目录 一. 树 1.1. 树的定义 1.2. 树的基本术语 1.3. 树的性质 二. 二叉树 2.1. 二叉树的定义 2. ...

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

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

  5. 树的高度从零还是一开始数_数据结构与算法之1——树与二叉树

    数据结构一直是让人头疼,面试遇到手撕算法题时真是慌得不行,从啥也不会刷题刷到游刃有余,路漫漫其修远兮~~.本人还是个算法菜鸟,而且还是想转行互联网的半吊子(好想拿大厂offer啊,幻想中..),希望能 ...

  6. 数据结构与算法3(树型结构)

    树型结构 树形结构: 1.树的基本概念 2.树的表示方法:倒悬树.嵌套法.凹凸法 3.树的专业术语(不同资料略有不同) 4.树的存储 双亲表示法 顺序 孩子表示法 兄弟表示法 树形结构: 1.树的基本 ...

  7. 看图轻松理解数据结构与算法系列(2-3树)

    前言 推出一个新系列,<看图轻松理解数据结构和算法>,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握.本系列包括各种堆.各种队列.各种列表.各种树.各种图.各种排序等等几十篇的 ...

  8. 【数据结构与算法基础】树与二叉树的互化

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

  9. 【数据结构与算法】AVL树的Java实现

    前情提要 之前只写了一些AVL树核心算法,这里给出一个AVL树的完整实现. AVL树是平衡查找二叉树,不仅能避免二叉搜索树出现斜树的状况,更是能保持比较标准的O(log2N),但AVL树可能需要很多次 ...

最新文章

  1. 稀疏矩阵十字链表表示
  2. 【微软公有云系列】(七)SCVMM模板--Windows server 2012 虚拟机模板
  3. IOS本地日志记录解决方案
  4. linux 安装sap,Solman系列 安装SAP Solution Manager 7.1 on Suse Linux
  5. 精通JavaScript--01面向对象JavaScript
  6. jd-eclipse反编译插件的离线安装和使用
  7. 在DropboxEdge网络上评估BBRv2
  8. 好的文案,极大的降低沟通成本
  9. Mybatis案例升级版——小案例大道理
  10. 从零开始学ios开发(三):第一个有交互的app
  11. PAT (Advanced Level) Practice 1001 A+B Format (20分)
  12. 百度杀毒软件2013低调发布
  13. java开源工作流引擎
  14. java excel 设置列为日期,POI设置Excel单元格格式 (数值,日期,文本等等)
  15. Amigo---Android hotfix terminator
  16. sessionStorage和localStorage
  17. 八、Identity Card
  18. PTA 1072 开学寄语
  19. 【BJOI2019】勘破神机(下降幂转自然幂)(第一类斯特林数)(特征方程)
  20. 华为nova8计算机功能在,华为nova8隐藏功能怎么开启(华为nova8的隐藏功能)

热门文章

  1. android语音识别之科大讯飞语音API的使用
  2. 【C++中单引号‘ ‘的意义及作用】
  3. 操作符基础----加减乘除赋值
  4. 现在学 NLP 还来得及吗?
  5. 过期域名有价值吗?抢注过期域名的几大注意事项
  6. 员工入职流程自动化的原因
  7. 验证身份证信息(python)
  8. android 省电优化,如何延长续航时间 浅谈Android手机的省电机制
  9. 诗经 - 小雅 - 蓼萧
  10. python matplotlib 绘制不等距数据