二叉树、BTree、B+Tree

二叉树

  • 二叉树是一种树形存储结构,通过二叉树,可以有序地存储数据,并且快速查找元素。
  • 二叉树节点的,左节点及左节点的所有子节点,都小于自身;右节点及右节点的所有子节点都大于自身。
  • 因此,插入数据的时候,可以从根节点开始,不断地进行比较,若小于该节点就左走,大于该节点就往右走,直至找到一个可以让自己成为叶子节点的位置。
    二叉树、BTree、B+Tree_第1张图片
  • 在搜索的时候,非常方便,就和插入新节点的步骤很类似。从根节点开始,不断地将要搜索的内容和当前位置节点的内容进行比较,若大于该位置节点的内容,就往右走,若小于就往左走,若等于那就是找到了。
    二叉树、BTree、B+Tree_第2张图片
  • 删除节点也非常简单。如果节点是叶子节点,那就直接删除就好了。如果不是叶子节点,那就首先通过搜索找到需要被删除的节点,然后顺藤摸瓜找到要被删除节点的右节点中最小的节点,替换掉要被删除的节点即可。
    二叉树、BTree、B+Tree_第3张图片
  • 由上面的方法易知,查找一个节点所需要的时间复杂度是O(logn),比遍历查询O(n)要快。

BTree

  • 又叫多路平衡搜索树,是二叉树的变种。
  • 二叉树一个节点就存储一份内容,然后通过两个指针分别指向大于该内容的节点以及小于该内容的节点。
  • 而BTree则针对这个思想,对树进行了改良,减少了树的深度,提高查询效率。
  • BTree 上面最多可以存储m-1 个内容,并且可以有m 个指针。意思就是,m-1 个内容可以将区间分割成m块,每一个指针分别指向那一块区间。
  • 当某个节点的内容,超过了 m-1 个的时候,就将m个内容中,中间的那个内容向上提取,如果上面没有节点了,那它就成为最新的根节点;如果向上还有节点,那就加入它们。而中间内容的左边和右边,形成两个新的节点,由中间的那个内容的节点指向它们。

例子

  • 以5叉BTree,插入 C N G A H E K Q M F W L T Z D P R X Y S 数据为例
  • 插入前4个字母 C N G A
    二叉树、BTree、B+Tree_第4张图片
  • 插入H,n>4,中间元素G字母向上分裂到新的节点
    二叉树、BTree、B+Tree_第5张图片
  • 插入E,K,Q不需要分裂
    二叉树、BTree、B+Tree_第6张图片
  • 插入M,中间元素M字母向上分裂到父节点G
    二叉树、BTree、B+Tree_第7张图片
  • 插入F,W,L,T不需要分裂
    二叉树、BTree、B+Tree_第8张图片
  • 插入Z,中间元素T向上分裂到父节点中
    二叉树、BTree、B+Tree_第9张图片
  • 插入D,中间元素D向上分裂到父节点中。然后插入P,R,X,Y不需要分裂
    二叉树、BTree、B+Tree_第10张图片
  • 最后插入S,NPQR节点n>5,中间节点Q向上分裂,但分裂后父节点DGMT的n>5,中间节点M向上分裂
    二叉树、BTree、B+Tree_第11张图片
  • 到此,该BTree树就已经构建完成了,BTree树 和 二叉树 相比, 查询数据的效率更高, 因为对于相同的数据量
    来说,BTree的层级结构比二叉树小,因此搜索速度快

定理

  • 通过上面的例子,可以感性地认识到BTree的巧妙之处,它通过不断地抽离,将区间一层一层地分割,我们可以简单地通过比较大小,找到需要内容所处的区间。
  • 而通过上面例子,可以推导出一些定理:
  • 树的每个节点最多包含m个指针,也就是m个孩子节点。因此每个节点最多由m-1个内容。
  • 每次节点满了之后,都会有一次节点的拆分,而拆分出来的孩子节点的个数是固定的,就是(m-1)/2。当然如果m-1是奇数,那就左右子节点的内容个数会差一(小问题小问题)。由此,可以推导出来,除根节点外的所有节点,都至少有ceil((m/2)-1个内容。
  • 而卡在中间的节点,若到达m个内容之后,就会开始要分裂。要将现有的m个节点对半分,让两个新节点承担。因此可以推导出:除根节点与叶子节点外,每个节点至少有 ceil(m/2) 个孩子。而节点最多只能有m个孩子。

B+Tree 结构

二叉树、BTree、B+Tree_第12张图片

  • B+Tree为BTree的变种,B+Tree与BTree的区别为:
    • n叉B+Tree最多含有n个key,而BTree最多含有n-1个key。
    • B+Tree的叶子节点保存所有的key信息,依key大小顺序排列。
    • 所有的非叶子节点都可以看作是key的索引部分。
  • 由于B+Tree只有叶子节点保存key信息,查询任何key都要从root走到叶子。所以B+Tree的查询效率更加稳定。
  • 个人理解,B+Tree的所有非叶子节点也就起到一个分流的左右。例如,当一个数5>=m>10的时候,就分流通过P1->P1进入第一个列表中。
  • 因此,除叶子节点外的所有节点,也就起到一个索引的作用。
  • 其余操作,和BTree 应该没有太大差别
    二叉树、BTree、B+Tree_第13张图片
  • MySql索引数据结构对经典的B+Tree进行了优化。
  • 在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能。
  • 因此,在查排好序的索引的内容、查区间的时候,就会非常方便。
  • B+Tree是MySQL索引的默认数据结构,很重要!!!

你可能感兴趣的:(二叉树,数据结构,树结构,mysql)