From 06ef89076a01c97e1765e0eba9774fefc85062b0 Mon Sep 17 00:00:00 2001
From: Florian Burgener <florian.brgnr@gmail.com>
Date: Tue, 17 May 2022 21:50:13 +0200
Subject: [PATCH] Duplicate key can no longer be inserted

---
 __main__.py | 103 +++++++++++++++++++++++++++-------------------------
 1 file changed, 53 insertions(+), 50 deletions(-)

diff --git a/__main__.py b/__main__.py
index ab4fb51..9cbaa69 100644
--- a/__main__.py
+++ b/__main__.py
@@ -194,6 +194,9 @@ def insertion_find_leaf(root, key):
 def bptree_insert(root, key):
     parents, leaf = insertion_find_leaf(root, key)
 
+    if is_value_in_array(leaf.keys, key):
+        return
+
     if node_is_full(leaf):
         insert_full(root, parents, leaf, key, None)
     else:
@@ -205,22 +208,6 @@ def bptree_insert(root, key):
 # 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):
     if root.is_leaf:
         return root.keys[0]
@@ -275,7 +262,7 @@ def bptree_delete_internal(root, parents, node, 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)
         leaf.keys.pop(deletion_index)
         bptree_delete_internal(root, parents, parents.pop(), key)
@@ -343,6 +330,22 @@ def bptree_delete_leaf(root, parents, leaf, 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):
     parents, leaf = deletion_find_leaf(root, key)
 
@@ -417,48 +420,48 @@ def main():
     random.seed(a)
 
     order = 2
-    # root = Node(order)
-    # keys = generate_random_keys(40, 1, 99)
-    # print(keys)
+    root = Node(order)
+    keys = generate_random_keys(40, 1, 99)
+    print(keys)
 
-    # for key in keys:
-    #     bptree_insert(root, key)
+    for key in keys:
+        bptree_insert(root, key)
 
-    # bptree_print(root)
-    # extracted_keys = bptree_extract_all_keys(root)
-    # assert extracted_keys == sorted(keys)
+    bptree_print(root)
+    extracted_keys = bptree_extract_all_keys(root)
+    assert extracted_keys == sorted(keys)
 
-    # for key in keys:
-    #     assert bptree_search(root, key)
+    for key in keys:
+        assert bptree_search(root, key)
 
-    # for _ in range(5):
-    #     while True:
-    #         random_key = random.randint(1, 99)
+    for _ in range(5):
+        while True:
+            random_key = random.randint(1, 99)
 
-    #         if random_key not in keys:
-    #             break
+            if random_key not in keys:
+                break
 
-    #     assert not bptree_search(root, random_key)
+        assert not bptree_search(root, random_key)
 
-    root = Node(order)
-    keys = generate_random_keys(18, 1, 99)
-    print(keys)
-    print("=====")
+    # root = Node(order)
+    # keys = generate_random_keys(18, 1, 99)
+    # print(keys)
+    # print("=====")
 
-    for key in keys:
-        bptree_insert(root, key)
+    # for key in keys:
+    #     bptree_insert(root, key)
 
-    bptree_delete(root, 56)
-    bptree_delete(root, 82)
-    bptree_delete(root, 75)
-    bptree_insert(root, 80)
-    bptree_delete(root, 47)
-    # bptree_delete(root, 80)
-    bptree_delete(root, 21)
-    bptree_delete(root, 22)
-    bptree_delete(root, 12)
-    bptree_delete(root, 8)
-    bptree_print(root)
+    # bptree_delete(root, 56)
+    # bptree_delete(root, 82)
+    # bptree_delete(root, 75)
+    # bptree_insert(root, 80)
+    # bptree_delete(root, 47)
+    # # bptree_delete(root, 80)
+    # bptree_delete(root, 21)
+    # bptree_delete(root, 22)
+    # bptree_delete(root, 12)
+    # bptree_delete(root, 8)
+    # bptree_print(root)
 
 
 if __name__ == "__main__":
-- 
GitLab