【BTree、B-树】B树的C++实现

一、B树的概念

B树是平衡的多叉树,一个节点有多于两个(不能小于)结点的平衡多叉树。

由于B树倒着生长所以平衡。

缺点:浪费空间

二、B树满足以下性质:

1、根结点至少有两个孩子。[2,M]个孩子
2、每个非根结点有【(M/2),M】个孩子。
3、每个非根结点有【(M/2-1),M-1】个关键字,并且以升序排序。
4、每个结点孩
5、key[i]和key[i+1]之间的孩子节点的值介于key[i]、key[i+1]之间
6、所有的叶子结点在同一层

三、结点的构造:

由于B树的性质,我们写出了如下每个结点应该包含的内容。

  • 包含大小为M-1的kvs数组,但是要方便我们后续的插入分裂操作,所以多开一个结点方便我们分裂 ,即大小为M的kvs数组
  • 包含了父节点指针
  • 包含结点指针类型的数组,数组中存放的是孩子指针
  • 包含size_t参数,代表实际关键字数量
  • 最后写上构造函数

四、树的构造:

(1)查找结点:

查找结点返回值是一个pair,如果找到了结点,返回结点cur和此结点的位置,没有找到则返回父节点和-1。

查找的具体过程就是遍历结点构成的数组即可,需要注意的是边界条件,同时在遍历过程中看在树的左边和后面。

(2)插入:

分裂原理:

如果M为3设置数组大小为3(注意不能为2),当结点数为3时候要分裂,左右分裂的时候,先找中位数,中位数右边的结点分一半,中位数左边的结点分一半,中位数占一个,为父亲结点。

需要注意的是:

不能向非叶子结点插入
为了让结点插入传入的是pair K,V

插入方法:

①如果ROOT为空,则构造结点直接插入,需要注意的是调整size
②对树进行查找,调用查找函数,接收返回值。
③由于返回值是一个pair,所以判断返回值的第二个参数,如果存在,则参数为大于等于0,插入不成功返回false,否则进行插入。
④没有找到的时候返回pair的第一个参数是插入节点的父亲结点,构造节点调用insertKV(此处逻辑复杂,单独写出来)进行插入。
⑤判断插入后结点的size值,如果小于M则直接插入成功,反之需要进行分裂。
⑥分离时调用DivideNode函数,

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值