2阶B树是一个完整的二叉树吗?

时间:2016-04-10 07:55:59

标签: data-structures tree b-tree

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

完整二叉树的定义如下:

  

完整的二叉树(有时是适当的二叉树或2树)是一棵树,其中叶子以外的每个节点都有两个孩子。

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

例如:

  

将10,17,45插入2阶B树中

我们得到的结构是

10
   17
      45

这不是完整的二叉树。

那么为什么它说2阶B树是一个完整的二叉树?

3 个答案:

答案 0 :(得分:3)

对于B树来说,“秩序”这个术语的定义很差,几乎没用......每个人都以不同的方式使用这个术语。

尽管如此,对于任何类型的B树,节点中指针的数量由该节点中的键数确定。如果键的数量是k,那么指针的数量是k + 1,周期。关于指针的数量没有选择,因为其他类型的树可能存在。节点中的所有指针都是nil(单个“树”中的根,离开)或者都是有效的,没有中间的,没有混合。

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

将键10,17和45插入到可能最低顺序的空B树中将如下所示:

[]

[10]

[10 17]

   [17]
[10]  [45]

最终结果确实看起来像一个平衡的二叉树。

但是,由于上面所示的原因,在你似乎使用这个术语(每个节点最多两个指针)的意义上没有2阶B树。在将多个密钥插入到这样的简并B树中时,不可能保持B树不变量。

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

答案 1 :(得分:0)

根据Fundamentals of Data Structure in C++ by Horowitz,它提到2阶B树确实必须是完整树。但是,任何2级(具有1个或2个子级)的树(任何数量的节点)都不能成为B树,只有具有2^k个节点的树才能形成2级的B树。它也提到对于order > 2的B树,任何数量的节点都可以形成order > 2的B树。也就是说,阶数为2的B树是B树的一种特例。

答案 2 :(得分:0)

为了回答这个问题,我们先来看看 m 阶 B 树的定义:

  1. Root 有两个孩子;
  2. 每个节点应该有不少于ceil(m / 2)个子节点;
  3. 叶节点应放置在同一级别。
  4. (隐含的东西)B-Tree也是一个m-way Search Tree

注意,由于 B 树也是 m-way 搜索树,每个具有 p 个内部节点的节点应该有不少于 p + 1 个子节点.因此,由于二阶 B 树要求每个节点的子节点不少于 2 个,每个节点的子节点不超过 2 个,因此 m 阶 B 树是一个完整的 BST。