Creación de una lista de un árbol de búsqueda binaria

votos
4

Estoy tratando de hacer una lista de todos los elementos de un árbol de búsqueda binaria. Entiendo que la recursividad, pero no sé cómo hacer que vuelva cada valor y luego lo incluyan en una lista. Quiero crear una función llamada makeList()que devolverá una lista de todos los artículos en mi árbol. Todas las funciones en mis programas de trabajo, excepto la makeList()función y se incluyen para asegurarse de que todo el mundo entiende la estructura básica de cómo puedo configurar mi árbol.

class Node(object):
    def __init__(self, data):
        self.data = data
        self.lChild = None
        self.rChild = None

class Tree(object):
    def __init__(self):
        self.root = None

    def __str__(self):
        current = self.root

    def isEmpty(self):
        if self.root == None:
            return True
        else:
            return False

    def insert (self, item):
        newNode = Node (item)
        current = self.root
        parent = self.root

        if self.root == None:
            self.root = newNode
        else:
            while current != None:
                parent = current
                if item < current.data:
                    current = current.lChild
                else:
                    current = current.rChild

            if item < parent.data:
                parent.lChild = newNode
            else:
                parent.rChild = newNode

    def inOrder(self, aNode):
        if aNode == None:
            pass
        if aNode != None:
            self.inOrder(aNode.lChild)
            print aNode.data
            self.inOrder(aNode.rChild)

    def makeList(self, aNode):
        a = []
        self.inOrder(aNode)
        a += [aNode.data]
        print a

n = Tree()
for i in [4,7,2,9,1]:
    n.insert(i)

n.makeList(n.root)

En cuanto a mi makeList()función de lo que puedo ver por qué no funciona, pero no sé cómo hacer que funcione.

EDITAR

Ok, lo tengo! E incluso me dieron dos respuestas que son:

def makeList(self, aNode, a = []):
    if aNode != None:
        self.makeList(aNode.lChild, a)
        a += [aNode.data]
        self.makeList(aNode.rChild, a)
    return a

y

def makeList2(self, aNode):
    if aNode is None:
        return []
    return self.makeList2(aNode.lChild) + [aNode.data] + self.makeList2(aNode.rChild)

Y mirando hacia atrás puedo ver que yo no entiendo muy bien la recursividad por lo que es hora de golpear los libros! Cualquier persona tiene buenos recursos en la recursividad?

Otra cuestión, por lo que decir que yo llamo mi makeList()función. Cuando pasa a través de Python makeList(), cuando se llega a la self.makeList(aNode.lChild, a)Cómo comienza ejecutar la función de nuevo mientras aún está terminando la makeList()función o no parar todo y que sólo comienza de nuevo con su nueva aNode?

Espero que tenga sentido.

Publicado el 05/04/2011 a las 02:09
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
1

inOrderimprime las cosas, pero no devuelve nada, por lo que es inútil para la creación de una lista. Se necesita una manera de volver cada nodo en orden. Esto puede ser algo que su clase no ha cubierto todavía, pero echa un vistazo a los yieldcomandos.

Respondida el 05/04/2011 a las 02:21
fuente por usuario

votos
0

La idea básica es algo como esto:

def makeList(self):
    return self.lChild.makeList() + [self.data] + self.rChild.makeList()

Vea cómo es esencialmente el mismo que el finde?

Usted tiene una estructura diferente en su programa que hace que sea un poco más difícil de implementar, pero la idea básica es la misma.

Respondida el 05/04/2011 a las 02:43
fuente por usuario

votos
1

Estás tan cerca! makeList puede ser bastante simple:

def makeList(self, aNode):
    if aNode is None:
        # Stop recursing here
        return []
    return self.makeList(aNode.lChild) + [aNode.data] + self.makeList(aNode.rChild)

Básicamente, asegúrese de que usted no está tratando de recursivo nodos vacíos pasados. A continuación, devolver la lista del árbol de la izquierda, el nodo actual, y la lista del árbol de la derecha.

Respondida el 05/04/2011 a las 03:15
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more