Data structures 二阶B-树是完全二叉树吗?

Data structures 二阶B-树是完全二叉树吗?,data-structures,tree,b-tree,Data Structures,Tree,B Tree,当我搜索上述问题时,我得到了一个答案Yes 完整二叉树的定义如下: 完整二叉树(有时是正确的二叉树或二叉树)是一棵树,其中除叶子外的每个节点都有两个子节点 但问题是,每次构造一个2阶B-树时,这个属性可能都不满足 例如: 在顺序为2的B-树中插入10,17,45 我们得到的结构是 10 17 45 这不是一个完整的二叉树 那么为什么说一棵2阶的B-树是一棵完整的二叉树呢?对于B-树来说,术语“阶”的定义太差了,以至于几乎没有用。。。每个人都以不同的方式使用这个术语 尽管如此,

当我搜索上述问题时,我得到了一个答案
Yes

完整二叉树的定义如下:

完整二叉树(有时是正确的二叉树或二叉树)是一棵树,其中除叶子外的每个节点都有两个子节点

但问题是,每次构造一个2阶B-树时,这个属性可能都不满足

例如:

在顺序为2的B-树中插入10,17,45

我们得到的结构是

10
   17
      45
这不是一个完整的二叉树


那么为什么说一棵2阶的B-树是一棵完整的二叉树呢?

对于B-树来说,术语“阶”的定义太差了,以至于几乎没有用。。。每个人都以不同的方式使用这个术语

尽管如此,对于任何类型的B-树,节点中指针的数量取决于该节点中键的数量。如果键的数量是k,那么指针的数量是k+1,句点。关于指针的数量没有选择,就像在其他类型的树中一样。要么一个节点中的所有指针都是nil(在一个级别的“树”中的根,叶),要么所有指针都是有效的,中间没有,没有混合

其次,为了使B-树发挥作用,需要在键的数量上进行选择。这意味着最小的可能的B-树节点是一个具有一个或两个键(因此具有两个或三个指针)的节点。这基本上是一个(2,3)-树,据报道这正是B-树被发明的方式-作为(2,3)-树的推广

将键10、17和45插入到一个尽可能低阶的空B-树中,如下所示:

[]

[10]

[10 17]

   [17]
[10]  [45]
最终的结果确实看起来像一个平衡的二叉树

然而,出于上述原因,在您似乎正在使用术语(每个节点最多两个指针)的意义上,不存在2阶B-树。在这种退化的B-树中插入多个密钥时,不可能保持B-树不变量


注意:有无数的B-树变体允许暂时甚至永久违反经典B-树的结构不变量,主要是为了达到性能目标、简化维护或实现无锁并发操作等特殊属性。在讨论中,这些数据不会被算为正确的B树,即使它们的名称中可能有“B树”。

< P>根据<代码>霍洛维茨的< /COD>中的C++数据结构的基本原理,它提到了2阶B树确实是一棵完整树。但是,没有任何2阶树(任何数量的节点)(具有1或2个子节点)可以是B树,只有那些具有
2^k
节点的树才能形成2阶B树。另一方面,它还提到,对于
顺序>2
的B树,任何数量的节点都可以形成
顺序>2
的B树。也就是说,2阶B树是B树的一种特例。

< p>回答问题,让我们看看m:< /p>的B-树的定义。
  • 根有两个孩子
  • 每个节点应有不少于ceil(m/2)个子节点
  • 叶节点应放置在同一级别
  • (给定的隐含内容)B-树也是一种m-路搜索树

  • 注意,由于B-树也是一个m-路搜索树,因此具有p个内部节点的每个节点应具有不少于p+1个子节点。因此,由于顺序为2的B-树要求每个节点具有不少于2个子节点,并且每个节点具有不多于2个子节点,因此顺序为m的B-树是完整的BST。

    您显示的10、17、45 B-树不是B-树。B-树是自平衡树,而该树是不平衡的。我的插入有错误吗?正确的插入将导致(10,17),45或10,(17,45)。是(10,17),45的顺序2?对于顺序为2的树,每个节点必须包含一个键(如果我没有记错的话),顺序为2的B树每个节点可以有一个或两个子节点。在节点满之前拆分节点是错误的,因此在任何正确的插入实现下,您都希望树有两个节点,而不是三个。你的树只是一个链表,是一个没有兴趣的退化案例。你能提供哪些原因吗?
    出于上述原因,没有2阶B-树这样的东西吗?@Dragos:2阶B-树(在OP使用的意义上,即每个节点最多2个指针)每个节点最多有一个密钥。除了空树的根之外,所有节点都必须至少有一个密钥,再加上这一事实,我们得出这样一个事实:每个节点只持有一个密钥。因此,您有一个二叉树,而不是B-树。。B-树需要在每个节点的键数上有摆动的空间才能工作,实现这一点的最小节点大小是一个可以容纳1个或2个键(因此也可以容纳2个或3个指针)的节点,即OP计算的顺序为3。