Я пытаюсь составить список всех элементов в бинарном дереве поиска. Я понимаю рекурсию , но я не знаю , как сделать это вернуть все значения , а затем добавить его в список. Я хочу создать функцию с именем , makeList()которая будет возвращать список всех элементов в моем дереве. Все функции в моих программах работают , кроме makeList()функции и включены , чтобы убедиться , что все понимают основную структуру того , как я создал мое дерево.
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)
Глядя на моей makeList()функции я могу понять , почему он не работает , но я не знаю , как заставить его работать.
РЕДАКТИРОВАТЬ
Ладно, я понял! И я даже получил два ответа, которые являются:
def makeList(self, aNode, a = []):
if aNode != None:
self.makeList(aNode.lChild, a)
a += [aNode.data]
self.makeList(aNode.rChild, a)
return a
а также
def makeList2(self, aNode):
if aNode is None:
return []
return self.makeList2(aNode.lChild) + [aNode.data] + self.makeList2(aNode.rChild)
И оглядываясь назад, я вижу, что я не понимаю рекурсии очень хорошо, так что пришло время, чтобы поразить книги! Кто-нибудь есть какие-либо хорошие ресурсы на рекурсии?
Другой вопрос, так сказать , я называю makeList()функцию. Когда Python проходит makeList(), когда он попадет в self.makeList(aNode.lChild, a)это начать показ функции еще раз , пока он все еще заканчивает makeList()функцию или делает все остановки , и это только начинается снова с его новым aNode?
Я надеюсь, что в этом есть смысл.













