节点不在叶子中的B +树?

时间:2015-11-05 13:03:59

标签: tree b-tree

我有B+tree。据我所知,B +树具有叶子中的所有节点,但是在这个B +树中,一些节点不在叶子节点中(例如40和10)。那是为什么?

如果我插入已经在树中的元素会怎么样?

1 个答案:

答案 0 :(得分:0)

从概念上讲,B +树由两部分组成:序列集(所有叶子,包含键和实际数据)和索引,它由所有内部节点组成,只包含键但没有数据。索引的唯一目的是引导搜索到正确的叶页。

索引节点中的键不必与实际存储在叶节点中的任何键相对应,因为它们只需将搜索路由到右侧叶子。换句话说,索引只需要分隔符键,而不是记录键。

当需要将新密钥添加到索引时,应用程序可能会选择以某种方式对其进行修改,以便以某种方式变得更加理想(例如,在字符串的情况下更短),同时仍保留其分离的能力它的左孩子来自正确的孩子。例如。 'M'将'Lehmann'与'Schulze'分开,就像'Müller'一样。例如,对于数字键,应用程序可以选择最大左子项和最小右项之间的算术平均值。

还有另一个原因可以解释为什么键可以出现在B +树的索引层中而叶子中没有任何相应的“记录”键(序列集),即删除。当要从B +树中删除密钥时,它只会从序列集中删除,序列集中包含由B +树表示的实际数据。如果索引层中存在密钥的副本,那么就可以单独使用,因为它仍然需要用于路由流量。

如果插入序列集中已存在的键,则会违反B +树的结构不变量。腐败的实际后果取决于使用B +树的代码,但生产级代码将保护其结构的不变量,并且很可能会在您的面前抛出异常。