Python Comprobando las rutas a la hoja en el árbol binario python dando datos en la hoja

Digamos que tengo este árbol:

cough Yes / \ No sneezing sneezing Yes / \ No Yes / \ No fever fever fever fever Yes / \ No Yes/ \No Yes / \ No Yes/ \No dead cold influenza cold dead influenza cold healthy 

Y quiero los caminos a la enfermedad "influenza" Lo que debería ser la salida es así:

 [[True,False,True],[False,True,False]] 

Si vas a la derecha de la raíz, devuelve Verdadero (Sí), si vas a Izquierda es Falso (No)

Este es el código que he estado tratando de hacer para esta función, pero estoy haciendo algo mal, no vuelve como quiero …

 def paths_to_illness(self, illness): head=self.__root new_list=[] new_list=diagnoser.get_path(head,illness) return new_list def get_path(self,head,illness): if head is None: return [] if (head.positive_child == None and head.negative_child==None): return [head.data] left_tree=diagnoser.get_path(head.negative_child,illness) right_tree=diagnoser.get_path(head.positive_child,illness) all_tree=left_tree+right_tree list1=[] for leaf in all_tree: if illness == leaf: list1.append(["True"]) else: list1.append(["False"]) return list1 

¿Alguna idea para ayudarme a arreglar mi código? Gracias

el diagonador es solo una clase que no es importante, mi clase de nodo tiene el derecho como "positive_child" y el izquierdo "negative_child"

Si algo más no está claro, por favor hágamelo saber

¡Gracias!.

Previa solicitud mi código para hacer el árbol:

 class Diagnoser: def __init__(self, root): self.__root = root class Node: def __init__(self, data="", pos=None, neg=None): self.data = data self.positive_child = pos self.negative_child = neg leaf1 = Node("dead", None, None) leaf2 = Node("cold", None, None) fever1 = Node("fever", leaf1, leaf2) leaf3 = Node("influenza", None, None) leaf4 = Node("cold", None, None) fever2 = Node("fever", leaf3, leaf4) sneezing1 = Node("sneezing", fever1, fever2) leaf5 = Node("dead", None, None) leaf6 = Node("influenza", None, None) fever3 = Node("fever", leaf5, leaf6) leaf7 = Node("cold", None, None) leaf8 = Node("healthy", None, None) fever4 = Node("fever", leaf7, leaf8) sneezing2 = Node("sneezing", fever3, fever4) root = Node("cough", sneezing1, sneezing2) diagnoser = Diagnoser(root) 

Esto es lo que se me ocurrió

 class Tree: def __init__(self, data, left=None, right=None): self.data = data self.left = left self.right = right @property def is_leaf(self): return not (self.left or self.right) def __repr__(self): return 'Tree({}, {}, {})'.format(self.data, self.left, self.right) def find(self, target, path_to=()): if self.is_leaf: if self.data == target: yield path_to else: if self.left: yield from self.left.find(target, (*path_to, True)) if self.right: yield from self.right.find(target, (*path_to, False)) t = Tree('Cough', Tree('Sneezing', Tree('Fever', Tree('Dead'), Tree('Cold')), Tree('Fever', Tree('Influenza'), Tree('Cold'))), Tree('Sneezing', Tree('Fever', Tree('Dead'), Tree('Influenza')), Tree('Fever', Tree('Cold'), Tree('Healthy')))) print(list(t.find('Influenza'))) 

Al hacer que nuestro método de find sea ​​un generador, podemos yield from fácilmente resultados positivos en la stack de llamadas utilizando el yield from . Si está utilizando una versión de Python que no admite el desempaquetado de argumentos (*path_to, True) , entonces path_to + (True,) es equivalente

Edit: Aquí hay una versión que no usa el yield

 def find(self, target, path_to=()): if self.is_leaf: if self.data == target: return [path_to] else: return [] else: if self.left: l = self.left.find(target, (*path_to, True)) if self.right: r = self.right.find(target, (*path_to, False)) return l + r