数据结构考点之b树


面试时,经常会在这里出错!一直也没有完全搞明白,讲义也是似懂非懂,真的有必要深入了解下。

如题2020年10月

在这里插入图片描述

分析

对这题答案,是完全出乎意外的,可见这块知识,应该是全未知。真得需要一个过程。
答案:根据 b树的限定 关键字的取值范围,可以得到 m/2(上取整)-1=13 -1
=12

过程(不应该是解决了)

引子

b树全称Balance-tree(平衡多路查找树),在数据结构复习之树表查找,只涉及到了二叉排序树,但没有涉及到平衡二叉树,所以直接过渡到B树的话,理解起来是有一定的跨度的。要想明白B树,先要理解平衡二叉树。

平衡二叉树

平衡:其实就是指左右均衡。平衡二叉树又被称为AVL树

平衡二叉树性质

它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

平衡二叉树解决问题

解决了二叉排序树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。从这点来说,要比二叉排树稳定;还是挺有实际意义的。
平衡二叉树大部分操作和二叉查找树类似,主要不同在于插入删除的时候平衡二叉树的平衡可能被改变。

平衡二叉树不平衡情形

把需要重新平衡的结点叫做α,由于任意两个结点最多只有两个儿子,因此高度不平衡时,α结点的两颗子树的高度相差2.容易看出,这种不平衡可能出现在下面4中情况中:

  1. 对α的左儿子的左子树进行一次插入
  2. 对α的左儿子的右子树进行一次插入
  3. 对α的右儿子的左子树进行一次插入
  4. 对α的右儿子的右子树进行一次插入
    如下图所示:在这里插入图片描述
单侧旋转

对于第1和4的情况下,插入发生在“外侧”,只需要通过一侧旋转即可
在这里插入图片描述

为使树恢复平衡,我们把k2变成这棵树的根节点,因为k2小于k1,把k1置于k2的右子树上,而原本在k2右子树的Y小于k1,k2,就把Y置于k1的左子树上,这样既满足了二叉查找树的性质,又满足了平衡二叉树的性质。图示所示的情形为左左,那么就右旋;这里要明白,从哪里开始右旋??从两边哪里开始不一样的,就从哪里开始旋?左孩子的左孩子,再插入一个结点的话,那就是从第1个左孩子不一样了,所以从第1个左开始右旋,即从左孩子k2右旋,变成根。

双侧旋转

对于2和3插入发生在“内侧”情形下,则需要两侧旋转才能完成。
在这里插入图片描述

第一步,把k2作为根,进行一次左旋转,旋转之后就变成了左左情况,所以第二步再进行一次右旋转,最后得到了一棵以k2为根的平衡二叉树树。同理,图示情形为左孩子的右孩子插入新结点情形,那么就先左旋???两边从哪里不一样的?从右孩子开始不一样,所以k2左旋变为根,以下类似

森林与二叉树转换不同

了解这些就够了,注意:森林、树与二叉树转换不同;详见:数据结构复习之线索二叉树 森林与二叉树相互转化,兄弟变为右孩子的思路是不同的,需要有连线操作。

b树或者b-树

b树也是平衡树,但是多路的,不再像平衡二叉树只有两个分支结点了。b树的父结点有多个孩子结点。

b树阶的概念

阶其实指非叶子结点的子结点的个数,也就是最多的查找路径;M阶=M路,当M=2则是2叉树,M=3则是3叉;实际上没有m=2,因为2阶b树其实就是平衡二叉树。一般m阶树指的都是m>=3的情形。

b树如何体现出是多路平衡树

b树的信息域(n,Ai,Ki,Ai+1…);Ki指的是关键字(本结点存储的关键字),并且前一个关键字小于后一个关键字的值,类似于平衡二叉树里的结点的值。最前面的n指的是本结点存储关键字的个数.;Ai为指向孩子结点的指针,且孩子结点里关键字值都小于Ki+1

2个子结点指针+1个关键字 这种数据结构,不就是二叉排序树的数据结构吗?平衡二叉树不过是人为规定了“每个非叶子结点都有两个孩子结点,并且子树的高度之差绝对值不大于1”,所以就有了“平衡”之说。

b树也是在二叉排序树的基础上得来的,只不过不同于平衡二叉树,人为规定使之平衡,而是使用扩展2+1这种数据结构的方式,使关键字个数不再为1了,而是可以最多到m-1.孩子结点最多可以是m;这样,一来可以存储的更多,并且由于是部分线性存储,可以查找更方便,二来,也不再规定子树高度值,而是直接将叶子结点放在同一层。这样就实现了平衡

b树的限定

由上面平衡可知,m阶对于b树是一种限定。
孩子结点取值是 m/2(上取整) <= Ai <= m
关键字个数取值(比孩子结点取值少1个) m/2(上取整)-1 <= Ki <= m-1

b+树与b树不同

  1. B+跟B树不同B+树的非叶子节点不保存关键字记录的指针(实际上只保存了子树中最小或最大结点的值),只进行数据索引,这样使得B+树每个非叶子节点所能保存的关键字大大增加
  2. B+树叶子节点保存了父节点的所有关键字记录的指针,所有数据地址必须要到叶子节点才能获取到。所以每次数据查询的次数都一样;
  3. B+树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针。
  4. 非叶子节点的子节点数=关键字数
    点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guangod

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值