我尝试在Java中为Btree编写插入代码,但是无法正确地拆分节点,是否有人可以指导我在Btree中插入,拆分和非完整插入的好算法?
感谢
答案 0 :(得分:0)
每个节点的假设:
以下是算法:
插入:搜索树以查找包含密钥的叶节点。插入钥匙。如果未完成操作,请查看键是否飞过(键的数量大于D-1)。如果飞越,请将该节点拆分为2个节点(本身和一个新节点),将最后一个(k)键移至新节点,使节点(叶节点)具有k +1个键。将叶子节点中的最后一个键移到父级。如果父项超载,请重复这些步骤。
删除:搜索树以找到包含要删除的密钥的节点。可能有2种情况。容器节点是叶节点,或者是内部非叶节点。如果它是内部节点,请首先在该节点中找到该密钥的直接前任,该密钥始终来自前导节点。然后,用此先前的密钥替换密钥。现在,您需要从叶节点删除密钥。 (请注意,从内部节点删除的操作总是减少为从叶节点删除的操作)。如果是叶节点,请从叶节点中删除密钥。检查叶节点是否在飞行中(少于k个键),否则操作未完成。如果飞行不足,则可能有3种情况。如果节点的左兄弟姐妹至少具有k + 1个键,则通过父级执行右旋转。否则,如果节点具有至少具有k + 1个键的右同级,则通过父级执行左旋转。否则,如果节点没有任何具有至少k + 1个键的同级,则将节点与其同级之一连接,同时从父级放下一个键。然后检查父级是否在飞行中,如果未进行过,请重复这些步骤以修复父级。
搜索:类似于二进制搜索树,主要区别在于现在您还需要在每个节点中执行搜索,因为每个节点都有已排序的键,因此您可以执行在每个节点上进行二进制搜索。