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())
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: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.