Sto cercando di fare una lista di tutti gli elementi in un albero binario di ricerca. Capisco la ricorsione, ma non so come farlo tornare ogni valore e poi aggiungerla in un elenco. Voglio creare una funzione chiamata makeList()che restituirà un elenco di tutti gli articoli nel mio albero. Tutte le funzioni nei miei programmi funzionano tranne la makeList()funzione e sono inclusi per assicurarsi che tutti capiscano la struttura di base di come ho creato il mio albero.
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)
Guardando la mia makeList()funzione Posso capire perché non funziona, ma non so come farlo funzionare.
MODIFICARE
Ok ho capito! E ho anche avuto due risposte che sono:
def makeList(self, aNode, a = []):
if aNode != None:
self.makeList(aNode.lChild, a)
a += [aNode.data]
self.makeList(aNode.rChild, a)
return a
e
def makeList2(self, aNode):
if aNode is None:
return []
return self.makeList2(aNode.lChild) + [aNode.data] + self.makeList2(aNode.rChild)
E guardando indietro posso vedere che non capisco molto bene la ricorsione quindi è il momento di colpire i libri! Chiunque ha tutte le buone risorse sulla ricorsione?
Un'altra domanda, in modo da dire che io chiamo la mia makeList()funzione. Quando Python passa attraverso makeList(), quando si arriva al self.makeList(aNode.lChild, a)vuol riprenderà la funzione mentre è ancora finendo la makeList()funzione o si ferma tutto e semplicemente ricomincia con il suo nuovo aNode?
Spero che abbia un senso.













