Tree B+;节点不在叶中的树?

Tree B+;节点不在叶中的树?,tree,b-tree,Tree,B Tree,我有这个。据我所知,B+树的所有节点都在叶子中,但在这个B+树中,一些节点不在叶子节点中(例如40和10)。为什么呢 如果我插入一个已经在树中的元素,会发生什么 从概念上讲,B+树由两部分组成:序列集(所有叶子,包含键和实际数据)和索引,索引由所有内部节点组成,只包含键,不包含数据。索引的唯一目的是引导搜索到正确的叶页 索引节点中的键不必对应于叶节点中实际存储的任何键,因为它们只需将搜索路由到右叶。换句话说,索引只需要分隔键,而不需要记录键 当需要将新键添加到索引中时,应用程序可能会选择以某种方

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


如果我插入一个已经在树中的元素,会发生什么

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

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

当需要将新键添加到索引中时,应用程序可能会选择以某种方式对其进行修改,以使其以某种方式变得更理想(例如,对于字符串,缩短键),同时仍保留将其左子项与右子项分开的能力。例如,“M”和“Müller”一样,把“莱曼”和“舒尔茨”分开。例如,对于数字键,应用程序可以选择最大左子项和最小右子项之间的算术平均值

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

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