def __remove(self, key): if self.cmpfunction(key, self.root.key) == 0: copy_node = tn.tree_node(self.root.key, self.root.value) if self.root.right is None: self.root = self.root.left elif self.root.left is None: self.root = self.root.right else: aux_node = self.__delete_max_tree_key(self.root.left) self.root.value = aux_node.value self.root.key = aux_node.key self.size -= 1 return copy_node rem_node = self.__find_node(key, self.root) if rem_node is not None: rem_node_copy = tn.tree_node(rem_node.key, rem_node.value) parent_cmp = self.cmpfunction(rem_node.key, rem_node.parent.key) if parent_cmp > 0: if rem_node.right is None and rem_node.left is None: del rem_node.parent.right elif rem_node.right is None and rem_node.left is not None: rem_node.left.parent = rem_node.parent rem_node.parent.right = rem_node.left elif rem_node.left is None and rem_node.right is not None: rem_node.right.parent = rem_node.parent rem_node.parent.right = rem_node.right else: aux_left = rem_node.left aux_node = self.__delete_min_tree_key(rem_node.left) rem_node.value = aux_node.value rem_node.key = aux_node.key if aux_node == aux_left: del rem_node.left else: rem_node.left = aux_left elif parent_cmp < 0: if rem_node.right is None and rem_node.left is None: del rem_node.parent.left elif rem_node.right is None and rem_node.left is not None: rem_node.left.parent = rem_node.parent rem_node.parent.left = rem_node.left elif rem_node.left is None and rem_node.right is not None: rem_node.right.parent = rem_node.parent rem_node.parent.left = rem_node.right else: aux_right = rem_node.right aux_node = self.__delete_max_tree_key(rem_node.left) rem_node.value = aux_node.value rem_node.key = aux_node.key if aux_node == aux_right: del rem_node.right else: rem_node.right = aux_right self.size -= 1 return rem_node_copy
def __delete_max_tree_key(self, tree): if tree is None: return None # print(f"Tree: {tree}\n Parent: {tree.parent}") if tree.right is None: copy_node = tn.tree_node(tree.key, tree.value) aux_node = tree.left if tree.parent is not None: if tree.left is None: del tree.parent.right else: new_node = self.__delete_max_tree_key(tree.left) tree.key = new_node.key tree.value = new_node.value if new_node == aux_node: del tree.left else: tree.left = aux_node else: new_node = self.__delete_max_tree_key(self.root.left) new_node.parent = None self.root.key = new_node.key self.root.value = new_node.value if new_node == aux_node: tree.left = tree.left.left else: tree.left = aux_node return copy_node return self.__delete_max_tree_key(tree.right)
def put(self, key, value): if self.root is None: self.root = tn.tree_node(key, value) self.root.color = 'ROOT' else: self.__insert_node(key, value, self.root) self.size += 1
def __insert_node(self, key, value, tree): node = tn.tree_node(key, value) cmp = self.cmpfunction(key, tree.key) if cmp > 0: if tree.right is None: tree.right = node else: self.__insert_node(key, value, tree.right) elif cmp < 0: if tree.left is None: tree.left = node else: self.__insert_node(key, value, tree.left) else: tree.value = value if tree.left is not None: if tree.left.left is not None and tree.left.color == 'R': if tree.left.left.color == 'R': self.__rotate_right(tree, tree.left, tree.left.left) if tree.right is not None and tree.left is not None: if tree.left.color == 'R' and tree.right.color == 'R': tree.switch_color() tree.left.switch_color() tree.right.switch_color() if tree.right is not None: if tree.right.color == 'R': self.__rotate_left(tree, tree.right)
def delete_max(self): if self.root is None: return None elif self.size == 1: copy_node = tn.tree_node(self.root.key, self.root.value) self.root = None self.size -= 1 return copy_node else: self.size -= 1 return self.__delete_max_tree_key(self.root)
def __insert_node(self, key, value, tree): node = tn.tree_node(key, value) cmp = self.cmpfunction(key, tree.key) if cmp > 0: if tree.right is None: tree.right = node node.parent = tree else: self.__insert_node(key, value, tree.right) elif cmp < 0: if tree.left is None: tree.left = node node.parent = tree else: self.__insert_node(key, value, tree.left) else: tree.value = value
def __delete_min_tree_key(self, tree): if tree is None: return None if tree.left is None: copy_node = tn.tree_node(tree.key, tree.value) aux_node = tree.right if tree.parent is not None: if tree.right is None: del tree.parent.left else: new_node = self.__delete_min_tree_key(tree.right) tree.key = new_node.key tree.value = new_node.value if new_node == aux_node: del tree.right else: tree.right = aux_node else: self.root = self.__delete_min_tree_key(self.root.right) self.root.parent = None return copy_node return self.__delete_min_tree_key(tree.left)