Exemple #1
0
    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
Exemple #2
0
    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)
Exemple #3
0
 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
Exemple #4
0
    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)
Exemple #5
0
 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)
Exemple #6
0
 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
Exemple #7
0
    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)