推出一个新系列,《看图轻松理解数据结构和算法》,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握。本系列包括各类堆、各类队列、各类列表、各类树、各类图、各类排序等等几十篇的样子。mysql
2-3树,是最简单的B-树,其中二、3主要体如今每一个非叶子节点都有2个或3个子节点,B-树便是平衡树,平衡树是为了解决不平衡树查询效率问题,常见的二叉平衡书有AVL树,它虽然提升了查询效率,可是插入操做效率不高,由于它须要再每次插入节点后维护树的平衡,而为了解决查询效率同时有兼顾插入效率,因而提出了2-3树。算法
刚开始是空树,插入节点“A”,建立根节点,sql
插入节点“B”,从根节点开始寻找存放的节点位置,与“A”节点合并后放到同一个叶子上,此时该叶子只包含“AB”两个项目,无需分裂,网络
继续插入节点“C”,从根节点开始寻找存放的节点位置,找到“AB”叶子节点,将其放进去,数据结构
但此时该叶子节点包含了“ABC”三个项目,须要将该节点进行分裂操做,分裂的具体过程以下,找到该节点三个项目中中间大的项,并发
上移成为最小项和最大项的父节点,而最小项做为中间项的左子节点,最大项做为中间项的右子节点。机器学习
继续插入“D”节点,从根节点开始寻找,数据结构和算法
大于“B”,因此往右,学习
找到“C”节点,并合并到该叶子节点,该节点只有两个项目,没必要分裂。.net
继续插入“E”,查找到“CD”叶子节点,放入“E”节点后发现该叶子节点有三个项目,须要分裂,
将中间项提高到父节点,其他两项分裂成两个子节点,“D”上升到父节点后存放在右边,并且父节点只有两个项目,没必要再继续分裂。
继续插入“F”节点,
往下看连续分裂两次的状况,继续插入“G”节点,大于“B”,继续比较,
大于“D”,往右子节点,
到右子节点后与“F”比较,发现大于“F”,放到右边,
发现“EFG”叶子节点有三个项目,必须分裂,
将中间项“F”提高到父节点,“E”和“G”左右两项分别称为左右子节点,
提高到父节点后发现父节点包含了“BDF”三项,也须要分裂,因而准备将中间项“F”提高,
发现“BDF”节点原本属于根节点,那么分裂后就没有根节点了,因而须要建立一个新节点做为根节点,即提高的“D”节点做为新的根节点。“B”和“F”左右两项分别做为左右子节点。
总结起来就是:一个节点插入到一棵2-3树中,先寻找该节点应该落到哪一个叶子节点上,注意必定是在叶子节点。将新节点做为一个新项加入到叶子节点中,此时若是该节点只有两个项目,则完成插入操做。但若是该节点有三个项目,则须要进行分裂操做,左中右三项按大小排序,将中间项提高到父节点中,而左右两项做为左右子节点,而后可能还没完,由于父节点上可能又包含了三个项目,若是是这样还得作分裂操做,一直递归到父节点只包含一个或两个项目。
2-3树的查找与二叉树的查找相似,从根节点开始比较,若是相等则查找成功,不然往下继续查找,对于只有两个子节点的节点则在其左右子树中递归查找,而对于有三个子节点的节点则须要在左中右子树中递归查找。
以下2-3树,查找“C”节点,
从根节点开始,与“D”比较,“C”小于“D”则往左,
继续与“B”比较,“C”大于“B”则往右,
“C”与“C”相等,找到。
若是要查找“H”节点,从根节点开始,“H”大于“D”则往右,
在“FH”节点中逐个项比较,先跟“F”项比较,“H”大于“F”,继续比较下一项,
“H”等于“H”,找到,在“FH”节点中找到“H”。
若是要查找“G”节点,从根节点开始,“G”大于“D”则往右,
“G”与“FH”节点逐个比较,大于“F”,继续比较下一项,
“G”小于“H”,即“G”间于“F”和“H”之间,因而往中间,
“G”等于“G”,找到。
-------------推荐阅读------------
个人开源项目汇总(机器&深度学习、NLP、网络IO、AIML、mysql协议、chatbot)
跟我交流,向我提问:
欢迎关注: