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