数据结构(六):复杂树之2-3树

 

一、 二叉平衡树的时间复杂度

  在数据结构(五):树中的二叉查找树中,我们发现当二叉树平衡时,我们查找一个元素需要遍历的层级是log(N+1),按照大O算法可得时间复杂度为logN,这种查找比链表和数组的O(N)算法要

  高效得多。

   

       但是当二叉树不平衡时,我们发现它的查找效率依旧是O(N),比如如下情况:

        

二、 2-3树概述

  为了保证二叉树的平衡,提高树查找的效率,减少遍历的层级,我们允许一个结点保留多个键,并且链接的不止两条链

   

  2-结点:

  含有一个键和两条链,左链指向的键都小于该结点,右链指向的键都大于该结点

  3-结点:

  含有两个键和三条链,左链指向的键都小于该结点,右链指向的键都大于该结点,中链指向的的键介于该结点的两个键之间

  注:2-3树中不允许有大于等于3个键的结点存在

三、 2-3查找树

  2-3树的查找思路与二叉查找树相似,对于需要查找的键,从根结点开始遍历,小于往左,大于则往右,当找到3-结点时,若查找的键介于3-结点的两个键之间,则找中链接对应的结点,命中则返回。

  查找过程没命中时则继续递归查找子树。

  如图:查找键为H的结点,首先找根结点M,由于H<M,往下找左子树

   

  查找到左子树为3-结点,判断H>E并且H<J,则找中链结点的键

   

四、 2-3树的插入

  往2-3树中插入结点的思路和二叉树一致,首先进行查找,根据2-3树的特性将结点挂到合适的位置,保持树的平衡。由于2-3树既包含2-结点同时也包含3-结点,因此在插入时针对不同类型的结点

  有不同的处理方式:

  一、 往2-结点中插入新键

  插入K:往2-结点中插入新键时,我们可以保证树层级不变的基础上,将2-结点转化为3-结点

   

  二、 往只有一个3-结点中插入新键

   

  往3-根结点中插入S

   

  将中键提升为根结点,左右两键成为左右子树

   

  三、 往一个父结点为2-结点的3-结点中插入新键

  往该2-3树中插入元素Z

   

  

  将3-结点的中间元素往上提

   

  四、 往一个父结点为3-结点的3-结点中插入新键

  往该2-3树中插入元素D

   

 

 

   

  将插入后形成的3-结点往上提

   

  将形成的3-父节点再次取中间值往上提升一层

   

  五、 插入结点到根结点的路径上是3-结点

  往该2-3树中插入D

  

 

 

   

  将插入后形成的3-结点取中间值往上提

   

  将形成的3-根结点再次分解

   

五、 2-3树总结

  5.1平衡的2-3树特性:

  (1)任意空链接到根结点的长度是相等的

  (2)非根结点的4-(3个键)结点变化为3-结点时,树高不变,只有当4-结点为根结点,分解后树的高度才会+1

  (3)2-3树与普通二叉树相比,不同的是2-3树自底向上生长,普通二叉树自顶向下生长。

  5.2引入2-3树思想的理由

  2-3树本身的实现是很困难的,引入2-3树的思想是为了下一章节的红黑树做铺垫

posted @ 2020-11-29 15:33  纪煜楷  阅读(672)  评论(0编辑  收藏  举报