• Martes 12 de Noviembre de 2024, 21:09

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - sepultura

Páginas: [1]
1
Python / Estructura Avl
« en: Domingo 27 de Mayo de 2007, 13:31 »
Buenas, despues de pasarme programando una clase de arbol binario unas quantas horas, e decidido implementarle un balanceo mediante la altura (AVL), pero no me funciona bien, les pido ayuda porque ya nose que mas intentar, aca les dejo el codigo de mi programa, aver si hay algun error que uds, pueden ver y yo no soy capaz:class CTree(object):

    __slots__ = ['__root', '__left', '__right']

    def __init__(self):

        self.__root = None
        self.__left = None
        self.__right = None

    def plant(self, data, left, right):

        self.__root = data
        self.__left = left
        self.__right = right

    def insert(self, data):

        a = CTree()
        b = CTree()

        if self.__root == None:
            self.plant(data, a, b )

        elif data < self.__root:
            self.__left.insert(data)
            self.balance()
           

        elif data > self.__root:
            self.__right.insert(data)
            self.balance()
           

        else:
            raise ValueError, 'Element already exists'

       

    def search(self, data):

        if self.__root == None:
            return None

        elif self.__root == data:
            return self.__root

        else:

            if self.__root < data:
                return self.__right.search(data)

            else:
                return self.__left.search(data)

    def height(self):

        if self.__root == None:

            return 0

        else:

            return (1 + max(self.__left.height(), self.__right.height()))

    def size(self):

        if self.__root == None:

            return 0

        else:

            return (1 + self.__left.size() + self.__right.size())

    def rotacio_s(self,left):

        aux = CTree()

        if left == 1:

            aux.plant(self.__left,self.__left.left,self.__root)

        elif left == 0:

            aux.plant(self.__right,self.__root,self.__right.right)

        self = aux

    def rotacio_d(self,left):

        if left == 1:

            self.__left.rotacio_s(0)
            self.rotacio_s(1)
        elif left == 0:

            self.__right.rotacio_s(1)
            self.rotacio_s(0)

    def balance(self):

        if self.__root != None:

            if ((self.__left.height() - self.__right.height()) == 2):

                if (self.__left.left.height() >= self.__left.right.height()):

                    self.rotacio_s(1)

                else:

                    self.rotacio_d(1)

            elif (self.__right.height() - self.__left.height() == 2):

                if (self.__right.right.height() >= self.__right.left.height()):

                    self.rotacio_s(0)

                else:

                    self.rotacio_d(0)
               

       

    def __str__(self):

        if self.__root == None:
            return ('NULL')

        else:
            return(str(self.__root) + '-' + str(self.__left) + '-' + str(self.__right))
       


rotacio_s, es la rotacion simple, rotacio_d, es la rotacion doble, espero ke me puedan ayudar, yo sigo trabajando en ello aver k tal :comp:  gracias

Páginas: [1]