es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problemas al imprimir una expresión de generador como una lista.

Estoy tratando de devolver los valores de todas las hojas en un árbol binario con un generador y poniendo los valores devueltos en una lista. Este es mi código recursivo que utiliza declaraciones yield, pero no sé cómo devolver los valores finales con un generador. El segundo fragmento de código titulado “Código anterior” muestra el mismo código con declaraciones de impresión que muestra los valores correctos, por lo que el único problema es el generador. Como nota, este código utiliza root.left y root.right importados de una clase Binary Tree y parece funcionar correctamente. ¡¡Gracias de antemano por cualquier ayuda!!

Mi código

    def leaves_list(self):
        def find(root):
            if not root:
                yield
            if not root.left and not root.right:
                yield root.data
            if root.left:
                find(root.left)
            if root.right:
                find(root.right)
        # mi intento
        a = find(self.root)
        lst = []
        for i in a:
            lst.append(next(a))
        return find(self.root)

Código anterior

def leaves_list(self):
    def find(root):
        if not root:
            return
        if not root.left and not root.right:
            print(root.data, end = " ")
            return
        if root.left:
            find(root.left)
        if root.right:
            find(root.right)
    return find(self.root)

Este es mi código de prueba y debería devolver la lista [5, 1, 8, 4].

Código de prueba

root = LinkedBinaryTree.Node(3)
T = LinkedBinaryTree(root)
a = LinkedBinaryTree.Node(2)
a.parent = root
root.left = a
b = LinkedBinaryTree.Node(7)
b.parent = root
root.right = b
c = LinkedBinaryTree.Node(9)
c.parent = a
a.left = c
d = LinkedBinaryTree.Node(5)
d.parent = c
c.left = d
e = LinkedBinaryTree.Node(1)
e.parent = c
c.right = e
f = LinkedBinaryTree.Node(8)
f.parent = b
b.left = f
g = LinkedBinaryTree.Node(4)
g.parent = b
b.right = g

print(T.leaves_list())

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para solucionar el código del generador, podemos utilizar la sentencia yield from para retornar de manera recursiva los valores de las hojas. Aquí está el código modificado:

    def leaves_list(self):
        def encontrar(raiz):
            if not raiz:
                return
            if not raiz.left and not raiz.right:
                yield raiz.data
            yield from encontrar(raiz.left)
            yield from encontrar(raiz.right)
    
        return list(encontrar(self.root))
    

    En este código, primero verificamos si la raíz es igual a None o no. Si lo es, retornamos de la función. De lo contrario, verificamos si la raíz es un nodo hoja (es decir, no tiene hijos). Si es así, retornamos su valor. Luego, utilizamos la sentencia yield from para retornar de manera recursiva los valores de los subárboles izquierdo y derecho (si existen).

    Finalmente, utilizamos la función list() para convertir el generador en una lista y retornarla. El código de prueba ahora debería imprimir [5, 1, 8, 4] como se esperaba.

Comments are closed.