使用Python编写B+树的删除操作代码

b+树删除操作需要先找到删除节点的位置,然后判断节点的键数。

如果节点中的键数量超过了最小数量,直接删除即可。

如下图,删除“40”:

Python代码实现B+树删除操作

如果节点中有确切的最小键数,删除就需要从兄弟节点那里借用,将兄弟节点的中间键添加到父节点。如下图,删除“5”:

立即学习“Python免费学习笔记(深入)”;

Python代码实现B+树删除操作

立即学习“Python免费学习笔记(深入)”;

删除内容节点,如果节点中的键数超过最小数量,只需从叶节点中删除该键,并从内部节点中删除该键。用中序后继填充内部节点中的空白区域。如下图,删除“45”:

立即学习“Python免费学习笔记(深入)”;

Python代码实现B+树删除操作

立即学习“Python免费学习笔记(深入)”;

删除内容节点,如果节点中有确切的最小键数,则删除该键并直接从兄弟节点借用一个键,用借来的键填充索引中的空白空间。如下图,删除“35”:

立即学习“Python免费学习笔记(深入)”;

Python代码实现B+树删除操作

立即学习“Python免费学习笔记(深入)”;

删除内容节点,在父节点上方生成空白空间。删除键后,将空白空间与其兄弟节点合并,用中序后继填充父节点中的空白空间。如下图,删除“25”:

立即学习“Python免费学习笔记(深入)”;

Python代码实现B+树删除操作

立即学习“Python免费学习笔记(深入)”;

导致树高度会缩小的删除操作,如下图,删除“55”:

立即学习“Python免费学习笔记(深入)”;

Python代码实现B+树删除操作

立即学习“Python免费学习笔记(深入)”;

Python实现B+树删除操作

import math# 创建节点class Node:    def __init__(self, order):        self.order = order        self.values = []        self.keys = []        self.nextKey = None        self.parent = None        self.check_leaf = False# 插入叶子    def insert_at_leaf(self, leaf, value, key):        if (self.values):            temp1 = self.values            for i in range(len(temp1)):                if (value == temp1[i]):                    self.keys[i].append(key)                    break                elif (value < temp1[i]):                    self.values = self.values[:i] + [value] + self.values[i:]                    self.keys = self.keys[:i] + [[key]] + self.keys[i:]                    break                elif (i + 1 == len(temp1)):                    self.values.append(value)                    self.keys.append([key])                    break        else:            self.values = [value]            self.keys = [[key]]# B+树class BplusTree:    def __init__(self, order):        self.root = Node(order)        self.root.check_leaf = True    # 插入节点    def insert(self, value, key):        value = str(value)        old_node = self.search(value)        old_node.insert_at_leaf(old_node, value, key)        if (len(old_node.values) == old_node.order):            node1 = Node(old_node.order)            node1.check_leaf = True            node1.parent = old_node.parent            mid = int(math.ceil(old_node.order / 2)) - 1            node1.values = old_node.values[mid + 1:]            node1.keys = old_node.keys[mid + 1:]            node1.nextKey = old_node.nextKey            old_node.values = old_node.values[:mid + 1]            old_node.keys = old_node.keys[:mid + 1]            old_node.nextKey = node1            self.insert_in_parent(old_node, node1.values[0], node1)    def search(self, value):        current_node = self.root        while(current_node.check_leaf == False):            temp2 = current_node.values            for i in range(len(temp2)):                if (value == temp2[i]):                    current_node = current_node.keys[i + 1]                    break                elif (value  parentNode.order):                    parentdash = Node(parentNode.order)                    parentdash.parent = parentNode.parent                    mid = int(math.ceil(parentNode.order / 2)) - 1                    parentdash.values = parentNode.values[mid + 1:]                    parentdash.keys = parentNode.keys[mid + 1:]                    value_ = parentNode.values[mid]                    if (mid == 0):                        parentNode.values = parentNode.values[:mid + 1]                    else:                        parentNode.values = parentNode.values[:mid]                    parentNode.keys = parentNode.keys[:mid + 1]                    for j in parentNode.keys:                        j.parent = parentNode                    for j in parentdash.keys:                        j.parent = parentdash                    self.insert_in_parent(parentNode, value_, parentdash)    # 删除节点    def delete(self, value, key):        node_ = self.search(value)        temp = 0        for i, item in enumerate(node_.values):            if item == value:                temp = 1                if key in node_.keys[i]:                    if len(node_.keys[i]) > 1:                        node_.keys[i].pop(node_.keys[i].index(key))                    elif node_ == self.root:                        node_.values.pop(i)                        node_.keys.pop(i)                    else:                        node_.keys[i].pop(node_.keys[i].index(key))                        del node_.keys[i]                        node_.values.pop(node_.values.index(value))                        self.deleteEntry(node_, value, key)                else:                    print("Value not in Key")                    return        if temp == 0:            print("Value not in Tree")            return    # 删除条目    def deleteEntry(self, node_, value, key):        if not node_.check_leaf:            for i, item in enumerate(node_.keys):                if item == key:                    node_.keys.pop(i)                    break            for i, item in enumerate(node_.values):                if item == value:                    node_.values.pop(i)                    break        if self.root == node_ and len(node_.keys) == 1:            self.root = node_.keys[0]            node_.keys[0].parent = None            del node_            return        elif (len(node_.keys) < int(math.ceil(node_.order / 2)) and node_.check_leaf == False) or (len(node_.values)  0:                        PrevNode = parentNode.keys[i - 1]                        PrevK = parentNode.values[i - 1]                    if i < len(parentNode.keys) - 1:                        NextNode = parentNode.keys[i + 1]                        PostK = parentNode.values[i]            if PrevNode == -1:                ndash = NextNode                value_ = PostK            elif NextNode == -1:                is_predecessor = 1                ndash = PrevNode                value_ = PrevK            else:                if len(node_.values) + len(NextNode.values) < node_.order:                    ndash = NextNode                    value_ = PostK                else:                    is_predecessor = 1                    ndash = PrevNode                    value_ = PrevK            if len(node_.values) + len(ndash.values) < node_.order:                if is_predecessor == 0:                    node_, ndash = ndash, node_                ndash.keys += node_.keys                if not node_.check_leaf:                    ndash.values.append(value_)                else:                    ndash.nextKey = node_.nextKey                ndash.values += node_.values                if not ndash.check_leaf:                    for j in ndash.keys:                        j.parent = ndash                self.deleteEntry(node_.parent, value_, node_)                del node_            else:                if is_predecessor == 1:                    if not node_.check_leaf:                        ndashpm = ndash.keys.pop(-1)                        ndashkm_1 = ndash.values.pop(-1)                        node_.keys = [ndashpm] + node_.keys                        node_.values = [value_] + node_.values                        parentNode = node_.parent                        for i, item in enumerate(parentNode.values):                            if item == value_:                                p.values[i] = ndashkm_1                                break                    else:                        ndashpm = ndash.keys.pop(-1)                        ndashkm = ndash.values.pop(-1)                        node_.keys = [ndashpm] + node_.keys                        node_.values = [ndashkm] + node_.values                        parentNode = node_.parent                        for i, item in enumerate(p.values):                            if item == value_:                                parentNode.values[i] = ndashkm                                break                else:                    if not node_.check_leaf:                        ndashp0 = ndash.keys.pop(0)                        ndashk0 = ndash.values.pop(0)                        node_.keys = node_.keys + [ndashp0]                        node_.values = node_.values + [value_]                        parentNode = node_.parent                        for i, item in enumerate(parentNode.values):                            if item == value_:                                parentNode.values[i] = ndashk0                                break                    else:                        ndashp0 = ndash.keys.pop(0)                        ndashk0 = ndash.values.pop(0)                        node_.keys = node_.keys + [ndashp0]                        node_.values = node_.values + [ndashk0]                        parentNode = node_.parent                        for i, item in enumerate(parentNode.values):                            if item == value_:                                parentNode.values[i] = ndash.values[0]                                break                if not ndash.check_leaf:                    for j in ndash.keys:                        j.parent = ndash                if not node_.check_leaf:                    for j in node_.keys:                        j.parent = node_                if not parentNode.check_leaf:                    for j in parentNode.keys:                        j.parent = parentNode# 输出B+树def printTree(tree):    lst = [tree.root]    level = [0]    leaf = None    flag = 0    lev_leaf = 0    node1 = Node(str(level[0]) + str(tree.root.values))    while (len(lst) != 0):        x = lst.pop(0)        lev = level.pop(0)        if (x.check_leaf == False):            for i, item in enumerate(x.keys):                print(item.values)        else:            for i, item in enumerate(x.keys):                print(item.values)            if (flag == 0):                lev_leaf = lev                leaf = x                flag = 1record_len = 3bplustree = BplusTree(record_len)bplustree.insert('5', '33')bplustree.insert('15', '21')bplustree.insert('25', '31')bplustree.insert('35', '41')bplustree.insert('45', '10')printTree(bplustree)if(bplustree.find('5', '34')):    print("Found")else:    print("Not found")

以上就是使用Python编写B+树的删除操作代码的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/88605.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月18日 00:09:14
下一篇 2025年11月18日 00:37:44

相关推荐

发表回复

登录后才能评论
关注微信