Example #1
0
class TreeBinary:
    def __init__(self, value):
        self._root = NodeTree()
        self._size = 0
        self._nodeAux = NodeTree()
        self._size = self._size + 1
        self._root.__set_value__(value)
        self._stack = Stack()
        self._stack.__push__(value, 0)

    def _is_child_left(self, root):
        if (root.__get_left__() != None):
            return True
        return False

    def _is_child_right(self, root):
        if (root.__get_right__() != None):
            return True
        return False

    def _child(self, root, value):
        if ((root.__get_value__() < value)
                and (self._is_child_left(root) == False)):
            return root

        if ((root.__get_value__() > value)
                and (self._is_child_right(root) == False)):
            return root

        if ((root.__get_value__() < value) and (root.__get_left__() != None)):
            return self._child(root.__get_left__(), value)

        if ((root.__get_value__() > value) and (root.__get_right__() != None)):
            return self._child(root.__get_right__(), value)

        return root

    def __is_empty_left(self):
        if (self._root.__get_left__() != None):
            return True
        return False

    def __is_empty_right(self):
        if (self._root.__get_right__() != None):
            return True
        return False

    def __root__(self):
        return self._root

    def __size__(self):
        return self._size

    def __insert__(self, value):
        self._size = self._size + 1
        self._stack.__push__(value, 0)
        if ((self.__is_empty_left() == False)
                and (value < self._root.__get_value__())):
            node = NodeTree()
            node.__set_father__(self._root)
            node.__set_value__(value)
            self._root.__set_left__(node)
        elif ((self.__is_empty_right() == False)
              and (value > self._root.__get_value__())):
            node = NodeTree()
            node.__set_value__(value)
            node.__set_father__(self._root)
            self._root.__set_right__(node)
        else:
            if (value < self._root.__get_value__()):
                child = self._child(self._root.__get_left__(), value)
                if (child != None):
                    if (value > child.__get_value__()):
                        node = NodeTree()
                        node.__set_value__(value)
                        node.__set_father__(child)
                        child.__set_right__(node)
                    else:
                        node = NodeTree()
                        node.__set_value__(value)
                        node.__set_father__(child)
                        child.__set_left__(node)

            else:
                child = self._child(self._root.__get_right__(), value)
                if (child != None):
                    if (value > child.__get_value__()):
                        node = NodeTree()
                        node.__set_value__(value)
                        node.__set_father__(child)
                        child.__set_right__(node)
                    else:
                        node = NodeTree()
                        node.__set_value__(value)
                        node.__set_father__(child)
                        child.__set_left__(node)

    def __search_node__(self, root, value):
        if (root == self._root):
            if (value > root.__get_value__()):
                root = root.__get_right__()
                self._nodeAux = root
            elif (value < root.__get_value__()):
                root = root.__get_left__()
                self._nodeAux = root
            else:
                return root

        if (value == self._nodeAux.__get_value__()):
            return self._nodeAux
        else:
            if ((root.__get_left__() != None)
                    and (root.__get_value__() != value)):
                self._nodeAux = root.__get_left__()
                self.__search_node__(root.__get_left__(), value)
            if ((root.__get_right__() != None)
                    and (root.__get_value__() != value)):
                self._nodeAux = root.__get_right__()
                self.__search_node__(root.__get_right__(), value)

        return self._nodeAux

    def __is_leaf__(self, root):
        if (root.__get_left__() == None and root.__get_right__() == None):
            return True
        return False

    def __search_min__(self, root, value):
        search = SearchUtil(self._stack.__extract_values__())

        if (root == self._root):
            node = self.__search_node__(root, value)
            if (self.__is_leaf__(node)):
                return None
            if (value > root.__get_value__()):
                root = root.__get_right__()
                self._nodeAux = root
            if (value < root.__get_value__()):
                root = root.__get_left__()
                self._nodeAux = root

        searchRet = search.search_for_previous_value(value)
        if (searchRet == self._nodeAux.__get_value__()):
            return self._nodeAux
        if (root.__get_left__() != None
                and searchRet != self._nodeAux.__get_value__()):
            self._nodeAux = root.__get_left__()
            self.__search_min__(root.__get_left__(), value)
        if (root.__get_right__() != None
                and searchRet != self._nodeAux.__get_value__()):
            self._nodeAux = root.__get_right__()
            self.__search_min__(root.__get_right__(), value)

        return self._nodeAux

    def __extract_values__(self):
        return self._stack.__extract_values__()

    def __remove__(self, root, value):
        self._size = self._size - 1
        nodeTree = self.__search_node__(root, value)
        if (nodeTree != None):
            nodeFather = nodeTree.__get_father__()
            if (nodeFather != None):
                self._stack.__pop_value__(value)
                if (self._is_child_left(nodeTree)
                        and self._is_child_right(nodeTree)):
                    nodeMin = self.__search_min__(root, value)
                    nodeMin.__set_father__(nodeFather)
                    if (nodeTree.__get_value__() > nodeMin.__get_value()):
                        nodeMin.__set_right__(nodeTree.__get_right__())
                        nodeTree.__get_right__().__set_father(nodeMin)
                    else:
                        nodeTree.__get_left__().__set_father(nodeMin)
                        nodeMin.__set_left__(nodeTree.__get_left__())

                    if (nodeFather.__get_value__() > nodeMin.__get_value__()):
                        nodeFather.__set_left__(nodeMin)
                    else:
                        nodeFather.__set_right__(nodeMin)
                else:
                    if (self.__is_leaf__(nodeTree)):
                        if (nodeTree.__get_value__() <
                                nodeFather.__get_value__()):
                            nodeFather.__set_left__(None)
                        else:
                            nodeFather.__set_right__(None)
                    else:
                        if (nodeTree.__get_value__() <
                                nodeFather.__get_value__()):
                            if (not self._is_child_left(nodeTree)
                                    and self._is_child_right(nodeTree)):
                                nodeTree.__get_right__().__set_father__(
                                    nodeFather)
                                nodeFather.__set_left__(
                                    nodeTree.__get_right__())
                            else:
                                nodeTree.__get_left__().__set_father__(
                                    nodeFather)
                                nodeFather.__set_left__(
                                    nodeTree.__get_left__())
                        else:
                            if (not self._is_child_left(nodeTree)
                                    and self._is_child_right(nodeTree)):
                                nodeTree.__get_right__().__set_father__(
                                    nodeFather)
                                nodeFather.__set_right__(
                                    nodeTree.__get_right__())
                            else:
                                nodeTree.__get_right__().__set_father__(
                                    nodeFather)
                                nodeFather.__set_right__(
                                    nodeTree.__get_left__())

            else:
                if (nodeTree == self._root):
                    if (self._is_child_left(nodeTree)
                            and self._is_child_right(nodeTree)):
                        nodeMin = self.__search_min__(self._root, value)
                        nodeFatherRemove = nodeMin.__get_father__()
                        if (nodeFatherRemove.__get_value__() >
                                nodeMin.__get_value__()):
                            if (not self._is_child_left(nodeMin)
                                    and not self._is_child_right(nodeMin)):
                                nodeFatherRemove.__set_left__(None)
                            else:
                                if (self._is_child_left(nodeMin)
                                        and not self._is_child_right(nodeMin)):
                                    nodeFatherRemove.__set_left__(
                                        nodeMin.__get_left__())
                                else:
                                    if (not self._is_child_left(nodeMin)
                                            and self._is_child_right(nodeMin)):
                                        nodeFatherRemove.__set_left__(
                                            nodeMin.__get_right__())
                        else:
                            if (not self._is_child_left(nodeMin)
                                    and not self._is_child_right(nodeMin)):
                                nodeFatherRemove.__set_right__(None)
                            else:
                                if (self._is_child_left(nodeMin)
                                        and not self._is_child_right(nodeMin)):
                                    nodeFatherRemove.__set_right__(
                                        nodeMin.__get_left__())
                                else:
                                    if (not self._is_child_left(nodeMin)
                                            and self._is_child_right(nodeMin)):
                                        nodeFatherRemove.__set_right__(
                                            nodeMin.__get_right__())

                        nodeMin.__set_left__(self._root.__get_left__())
                        nodeMin.__set_right__(self._root.__get_right__())
                        nodeMin.__set_father__(None)
                        self._root = nodeMin
                    else:
                        if (not self._is_child_left(nodeTree)
                                and not self._is_child_right(nodeTree)):
                            nodeTree = None
                            self._root = nodeTree
                        else:
                            if (self._is_child_left(nodeTree)
                                    and not self._is_child_right(nodeTree)):
                                child = nodeTree.__get_left__()
                                child.__set_left__(None)
                                child.__set_right__(None)
                                child.__set_father__(None)
                                self._root = child
                            else:
                                if (not self._is_child_left(nodeTree)
                                        and self._is_child_right(nodeTree)):
                                    child = nodeTree.__get_right__()
                                    child.__set_left__(None)
                                    child.__set_right__(None)
                                    child.__set_father__(None)
                                    self._root = child