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
gracias