Snažím se vytvořit seznam všech položek v binárním vyhledávacím stromu. Chápu, že rekurzi, ale nevím, jak ji vrátit všechny hodnoty a pak připojit jej do seznamu. Chci vytvořit funkci s názvem makeList(), který vrátí seznam všech položek v mém stromě. Všechny funkce ve svých programech pracovat s výjimkou makeList()funkce a jsou zahrnuty, aby se ujistil, každý chápe základní strukturu, jak mám nastavit svůj strom.
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)
Při pohledu na mou makeList()funkci Chápu, proč to nefunguje, ale já nevím, jak, aby to fungovalo.
UPRAVIT
Dobře chápu to! A dokonce jsem dostal dvě odpovědi, které jsou:
def makeList(self, aNode, a = []):
if aNode != None:
self.makeList(aNode.lChild, a)
a += [aNode.data]
self.makeList(aNode.rChild, a)
return a
a
def makeList2(self, aNode):
if aNode is None:
return []
return self.makeList2(aNode.lChild) + [aNode.data] + self.makeList2(aNode.rChild)
A při pohledu zpět vidím, že nerozumím rekurzi velmi dobře, a tak je čas udeřit do knihy! Každý, kdo má nějaké dobré zdroje na rekurze?
Další otázkou, takže říci, volám makeList()funkci. Když Python prochází makeList(), když se dostane na self.makeList(aNode.lChild, a)to znovu rozběhnou funkce, zatímco je stále dokončuje makeList()funkci, nebo se všechno zastaví a to jen začíná znovu s jeho novou aNode?
Doufám, že to dává smysl.













