Próbuję zrobić listę wszystkich elementów w wyszukiwaniu binarnym drzewie. Rozumiem rekurencję, ale nie wiem jak zrobić to wrócić każdą wartość, a następnie dołączyć go do listy. Chcę utworzyć funkcję o nazwie makeList(), która zwraca listę wszystkich elementów w moim drzewie. Wszystkie funkcje działają w moich programach z wyjątkiem makeList()funkcji i są włączone, aby upewnić się każdy rozumie podstawową strukturę jak skonfigurować moje drzewo.
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)
Patrząc na moje makeList()funkcji mogę zrozumieć, dlaczego to nie działa, ale nie wiem jak zrobić to działa.
EDYTOWAĆ
Ok, rozumiem! I nawet dostał dwie odpowiedzi, które są:
def makeList(self, aNode, a = []):
if aNode != None:
self.makeList(aNode.lChild, a)
a += [aNode.data]
self.makeList(aNode.rChild, a)
return a
i
def makeList2(self, aNode):
if aNode is None:
return []
return self.makeList2(aNode.lChild) + [aNode.data] + self.makeList2(aNode.rChild)
I patrząc wstecz widzę, że nie rozumiem rekursji bardzo dobrze, więc nadszedł czas, aby trafić na książki! Ktoś ma jakieś dobre środki na rekursji?
Inną kwestią, więc powiedzieć, że nazywają moją makeList()funkcję. Kiedy Python przechodzi makeList(), kiedy robi się do self.makeList(aNode.lChild, a)to zacząć ponownie uruchamiając funkcję, podczas gdy jest jeszcze kończąc się na makeList()funkcję lub nie wszystko zatrzymać i po prostu zaczyna się z nim nowegoaNode ?
Mam nadzieję, że to ma sens.













