2-3树的插入和删除

2-3树是多路查找树中的一种,出现多路查找树,主要是跟内存与磁盘交互有关。内存IO的速度比磁盘IO要快的多的多,但是同样空间大小的内存比硬盘要贵的多的多,像TB级别的数据库不可能全部读出来放到内存中去,太过昂贵,而且也没必要,大部分数据是不经常用的,所以就需要内存与外存互相结合,而如果用平衡二叉树这种数据结构,在大数据量的情况下,树肯定会很高,树高直接决定了查找效率,而同等高的平衡二叉树中存储的信息是远远少于多路查找树的信息,所以用多路查找树这种数据结构,高阶的情况下,树不用很高就可以标识很大的数据量了,检索次数就大大减少了,用这种数据结构去磁盘中存取数据,磁盘IO次数的次数也会很少。

2-3树

多路查找树用的最普遍的是2-3树和2-3-4树,而多路查找树最复杂的操作是插入和删除。这种多路查找树有两个重要的特性,1.叶子节点都在一层上面(表明了多路查找树是高度平衡的查找树)2.节点的孩子个数不能超过”树的名字“(例如:2-3树中节点的孩子数量最多为3个)。

多路查找树不到万不得已不会增加高度

插入

插入关键字分为几种情况:

1.向空树里面插入关键字,生成一个二节点

2.不是空树

(1)、插入的关键字的位置是一个二节点,将二节点扩展为三节点

(2)、插入的位置已经是个三节点了,就要找此节点的父亲节点,找到父节点不为3节点为止。例如上图插入了5后,想插入6就要向上找到50关键字为2节点,然后从5 7节点开始分裂调整成下图。如何所有的父节点都是3节点就可以增加高度了。

2-3树插入情况(2)-4

删除

1.删除的是叶子节点

(1)、删除的关键字为三节点中的关键字,直接将三节点变为二节点就可以了

(2)、删除的关键字为2节点,但是他的父节点的右孩子为3节点,如下图删除1,将6替代4的位置,4替代1的位置,将右孩子变成2节点。

(3)、删除的节点关键字为2节点,但是他父亲和他父亲的右儿子都是2节点,例如删除下图中的4,将根节点8的右孩子的最小值代替8的位置,8的左孩子的最大值用8代替,将6和7向左旋转。

(4)、树为满二叉树就减少高度

(5)、如何删除的为2节点,但是他的父亲为3节点,如下图删除10,将12  14节点变成2节点,12拿下来和13组成3节点。

2.当删除的不是叶子节点

用删除的关键字的后继代替删除的关键字即可

ADT:

  1. typedef struct node
  2. {
  3.     int a[2];//存节点中的关键字
  4.     int num;//关键字的个数
  5.     struct node *lchild, *rchild, *midchild;
  6.     struct node *parent;
  7.     //struct node *tmp_child;//2-3-4树的节点的第三个孩子,2-3树可以不要
  8. }BTree,*BtreePtr;

猜你喜欢

转载自blog.csdn.net/qq_40327837/article/details/85855403