diff --git a/src/BTree.py b/src/BTree.py index 5a696d9f872bf68ec490697fa14fa64c874800fe..c71c4f4dcc499dd03e018ea221bd0a1b1f3e8b46 100644 --- a/src/BTree.py +++ b/src/BTree.py @@ -15,38 +15,14 @@ class Btree() : (Node([5, 25]), 1) >>> Btree(2, Node([12, 42], [Node([1]), Node([25]), Node([50])])).search(1) (Node([1]), 0) - True >>> Btree(2, Node([12, 42], [Node([1]), Node([25]), Node([50])])).search(2) """ return self.root.search(value) -# incomplet -# def insertion(self, value): -# -# if (self.root == None): -# self.root = Bnode.Node(self.k) -# self.root.keys[0] = value -# else : -# if ( len(self.root) == self.k): -# new_root = Bnode.Node(self.k) -# new_root.childs[0] = self.root -# -# if (self) : -# ##TODO -# return None -# else: -# self.root.insert_not_full(value) -# - - #def insertion(self,value): -# >>> Node([5,25]).insertion(10) -# Node([5,10,25]) -# >>> Node([]).insertion(1) -# Node([1]) -# >>> Node([5,25]).insertion(50) -# Node([5,25,50]) - - + def insertion(self, value): + fini, milieu, g, d = self.root.insert(value) + if (not fini): + self.root = Node([milieu], [g, d]) @@ -70,4 +46,4 @@ class Btree() : if __name__ == '__main__': import doctest - doctest.testmod(verbose=True) \ No newline at end of file + doctest.testmod(verbose=False) \ No newline at end of file diff --git a/src/node.py b/src/node.py index e9280756b67e25e4f6e5ee0a01deb8d78062d500..03bc27ee6d51af401963f2f2fb5a1185105ca69e 100644 --- a/src/node.py +++ b/src/node.py @@ -39,47 +39,37 @@ class Node() : else : return self.childs[index].search(value) - def insert(self, value, k): + def insert(self, value): """ - >>> Node([5,15]).insert(12, 3) - Node([5,12,15]) - >>> Node([5,15]).insert(20, 4) - Node([5,15,20]) + >>> Node([5,15]).insert(12) + (True, None, None, None) + >>> Node([5]).insert(20) + (True, None, None, None) + >>> Node([12, 42], [Node([3,2])]).insert(1) + (True, None, None, None) """ - (node, index) = self.search(value) - if (node == None) : + (found, index) = recherche_dichotomique(value, self.keys) + if (not found) : if (self.isLeaf()): self.keys.insert(index, value) + if ( len(self.keys) > self.k): + milieu, g, d = self.splitNode() + return False, milieu, g, d + return True, None, None, None else: - (fini, milieu, g, d) = self.childs[index].insert(value, k) + (fini, milieu, g, d) = self.childs[index].insert(value) if (not fini) : self.keys.insert(index, milieu) self.childs[index] = g self.childs.insert(index+1, d) - - - - - - -# else : -# (fini, milieu, g, d) = self.childs[index].insert(value, k) -# if not fini: -# return None -# #TODO -# if (len(self.keys) > k) : -# (m, g, d) = self.splitNode() -# f = False -# else: -# return None - #TODO - - - -# def splitNode(self) : -# parent = Node(self.k) -# m = self.keys[(len(self.node.keys))//2] - + if ( len(self.keys) > self.k) : + milieu, g, d = self.splitNode() + return False, milieu, g, d + else : + return True, None, None, None + else : + return True, None, None, None + def splitNode(self) : """ >>> Node([10,20,25]).splitNode() @@ -90,41 +80,14 @@ class Node() : (5, Node([3]), Node([])) """ milieu = len(self.keys) //2 - parent = self.keys[milieu] g = Node(self.keys[:milieu], self.childs[:milieu+1]) d = Node(self.keys[milieu+1:], self.childs[milieu+1:]) - return (parent, g, d) - + return (self.keys[milieu], g, d) def __repr__(self) : return f"Node({self.keys})" - - - - - - - - - - - - - - - - - - - - #def getSizeNode() : - #def getPos() : - #def setNewChild() : - #def removeChild() : - - #def isLeaf() : if __name__ == '__main__': import doctest