Skip to content
Snippets Groups Projects
Commit 06ef8907 authored by Florian Burgener's avatar Florian Burgener
Browse files

Duplicate key can no longer be inserted

parent 07f18a24
No related branches found
No related tags found
No related merge requests found
...@@ -194,6 +194,9 @@ def insertion_find_leaf(root, key): ...@@ -194,6 +194,9 @@ def insertion_find_leaf(root, key):
def bptree_insert(root, key): def bptree_insert(root, key):
parents, leaf = insertion_find_leaf(root, key) parents, leaf = insertion_find_leaf(root, key)
if is_value_in_array(leaf.keys, key):
return
if node_is_full(leaf): if node_is_full(leaf):
insert_full(root, parents, leaf, key, None) insert_full(root, parents, leaf, key, None)
else: else:
...@@ -205,22 +208,6 @@ def bptree_insert(root, key): ...@@ -205,22 +208,6 @@ def bptree_insert(root, key):
# DELETION : START # DELETION : START
def deletion_find_leaf(root, key):
parents = []
current = root
while not current.is_leaf:
parents.append(current)
children_index = lower_bound(current.keys, key)
if children_index < len(current.keys) and current.keys[children_index] == key:
children_index += 1
current = current.children[children_index]
return parents, current
def bptree_find_smallest_key(root): def bptree_find_smallest_key(root):
if root.is_leaf: if root.is_leaf:
return root.keys[0] return root.keys[0]
...@@ -275,7 +262,7 @@ def bptree_delete_internal(root, parents, node, key): ...@@ -275,7 +262,7 @@ def bptree_delete_internal(root, parents, node, key):
def bptree_delete_leaf(root, parents, leaf, key): def bptree_delete_leaf(root, parents, leaf, key):
if len(leaf.keys) > leaf.order: if len(leaf.keys) > leaf.order or leaf == root:
deletion_index = find_value_index_in_array(leaf.keys, key) deletion_index = find_value_index_in_array(leaf.keys, key)
leaf.keys.pop(deletion_index) leaf.keys.pop(deletion_index)
bptree_delete_internal(root, parents, parents.pop(), key) bptree_delete_internal(root, parents, parents.pop(), key)
...@@ -343,6 +330,22 @@ def bptree_delete_leaf(root, parents, leaf, key): ...@@ -343,6 +330,22 @@ def bptree_delete_leaf(root, parents, leaf, key):
bptree_delete_internal(root, parents, parent, key) bptree_delete_internal(root, parents, parent, key)
def deletion_find_leaf(root, key):
parents = []
current = root
while not current.is_leaf:
parents.append(current)
children_index = lower_bound(current.keys, key)
if children_index < len(current.keys) and current.keys[children_index] == key:
children_index += 1
current = current.children[children_index]
return parents, current
def bptree_delete(root, key): def bptree_delete(root, key):
parents, leaf = deletion_find_leaf(root, key) parents, leaf = deletion_find_leaf(root, key)
...@@ -417,48 +420,48 @@ def main(): ...@@ -417,48 +420,48 @@ def main():
random.seed(a) random.seed(a)
order = 2 order = 2
# root = Node(order) root = Node(order)
# keys = generate_random_keys(40, 1, 99) keys = generate_random_keys(40, 1, 99)
# print(keys) print(keys)
# for key in keys: for key in keys:
# bptree_insert(root, key) bptree_insert(root, key)
# bptree_print(root) bptree_print(root)
# extracted_keys = bptree_extract_all_keys(root) extracted_keys = bptree_extract_all_keys(root)
# assert extracted_keys == sorted(keys) assert extracted_keys == sorted(keys)
# for key in keys: for key in keys:
# assert bptree_search(root, key) assert bptree_search(root, key)
# for _ in range(5): for _ in range(5):
# while True: while True:
# random_key = random.randint(1, 99) random_key = random.randint(1, 99)
# if random_key not in keys: if random_key not in keys:
# break break
# assert not bptree_search(root, random_key) assert not bptree_search(root, random_key)
root = Node(order) # root = Node(order)
keys = generate_random_keys(18, 1, 99) # keys = generate_random_keys(18, 1, 99)
print(keys) # print(keys)
print("=====") # print("=====")
for key in keys: # for key in keys:
bptree_insert(root, key) # bptree_insert(root, key)
bptree_delete(root, 56) # bptree_delete(root, 56)
bptree_delete(root, 82) # bptree_delete(root, 82)
bptree_delete(root, 75) # bptree_delete(root, 75)
bptree_insert(root, 80) # bptree_insert(root, 80)
bptree_delete(root, 47) # bptree_delete(root, 47)
# bptree_delete(root, 80) # # bptree_delete(root, 80)
bptree_delete(root, 21) # bptree_delete(root, 21)
bptree_delete(root, 22) # bptree_delete(root, 22)
bptree_delete(root, 12) # bptree_delete(root, 12)
bptree_delete(root, 8) # bptree_delete(root, 8)
bptree_print(root) # bptree_print(root)
if __name__ == "__main__": if __name__ == "__main__":
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment