Hvordan kan jeg representere binære søketrær i python?
representere binære søketrær i python
class Node(object):
def __init__(self, payload):
self.payload = payload
self.left = self.right = 0
# this concludes the "how to represent" asked in the question. Once you
# represent a BST tree like this, you can of course add a variety of
# methods to modify it, "walk" over it, and so forth, such as:
def insert(self, othernode):
"Insert Node `othernode` under Node `self`."
if self.payload <= othernode.payload:
if self.left: self.left.insert(othernode)
else: self.left = othernode
else:
if self.right: self.right.insert(othernode)
else: self.right = othernode
def inorderwalk(self):
"Yield this Node and all under it in increasing-payload order."
if self.left:
for x in self.left.inorderwalk(): yield x
yield self
if self.right:
for x in self.right.inorderwalk(): yield x
def sillywalk(self):
"Tiny, silly subset of `inorderwalk` functionality as requested."
if self.left:
self.left.sillywalk()
print(self.payload)
if self.right:
self.right.sillywalk()
etc, etc - i utgangspunktet som i alle andre språk som bruker referanser i stedet for pekere (som Java, C #, etc).
Edit :
Selvfølgelig, selve eksistensen av sillywalker dumt faktisk, fordi nøyaktig samme funksjonalitet er en ekstern svi-liner tekstutdrag på toppen av walkmetoden:
for x in tree.walk(): print(x.payload)
og med walkdu kan få bare om noen annen funksjonalitet på noder-in-order strøm, mens med sillywalk, kan du få omtrent diddly-squat. Men, hei, sier OP yielder "skremmende" (Jeg lurer på hvor mange av Python 2.6 øvrige 30 søkeord fortjener slike skremsels ord i OP skjønn -?) Så jeg håper printikke!
Dette er alt helt utenfor selve spørsmålet, på representerer BSTs: at spørsmålet er helt svarte i __init__- en payloadegenskap til å holde nodens nyttelast, leftog righttilskriver å holde enten None(betydning, har denne noden ingen etterkommere på den siden) eller en Node( toppen av sub-treet til etterkommere på den aktuelle side). Selvfølgelig er det BST begrensningen at hver venstre kommer av hver node (hvis noen) har en nyttelast mindre eller lik enn den node i spørsmålet, all rett til en (igjen, hvis noen) har en større nyttelast - Jeg la insertbare for å vise hvordan trivielt det er å opprettholde denne besk walk(og nå sillywalk) for å vise hvor trivielt det er å få alle nodene i stigende rekkefølge av nyttelast. Igjen, er den generelle ideen bare identisk til måten du ville representere en BST på alle språk som bruker referanser i stedet for pekere, som for eksempel C # og Java.













