Hoe kan ik vertegenwoordigen binaire zoekboom in python?
vertegenwoordigen binaire zoekboom in python
bron van user Bunny Rabbit
In andere talen...
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 - in principe zoals in andere taal die gevonden plaats pointers (zoals Java, C #, etc.) gebruikt.
bewerken :
Natuurlijk, het bestaan van sillywalkdwaas is inderdaad, want precies dezelfde functionaliteit is een singe-liner externe fragment op de top van de walkmethode:
for x in tree.walk(): print(x.payload)
en walku kunt verkrijgen zowat elke andere functionaliteiten op de knooppunten-in-order stroom, terwijl, met sillywalk, u kunt verkrijgen zowat diddly-squat. Maar hey, de OP zegt yieldis "intimiderend" (Ik vraag me af hoeveel van Python 2.6 van anderen 30 trefwoorden verdienen dergelijke schrikken woorden in het oordeel van de OP's -?), Dus ik hoop dat printis het niet!
Dit is al helemaal geen daadwerkelijke vraag op die BSTS: die vraag geheel in antwoord __init__- een payloadattribuut om nuttige lading van het knooppunt te houden, leften righttoeschrijven aan ofwel houder None(betekenis, deze node geen nakomelingen aan die kant) of Node( de bovenkant van de subboom van nakomelingen aan de juiste kant). Natuurlijk, de BST beperking is dat iedere linker nakomeling van elke node (indien aanwezig) een lading kleiner of gelijk aan die van het betreffende knooppunt, elk rechter (opnieuw, indien aanwezig) een grotere lading - I toegevoegd insertgewoon om te laten zien hoe triviaal het is om die beperking te handhaven, walk(en nu sillywalk) om te laten zien hoe triviaal het is om alle knooppunten te krijgen in oplopende volgorde van payloads. Nogmaals, het algemene idee is gewoon identiek aan de manier waarop je zou vertegenwoordigen een BST in elke taal waarin verwijzingen gebruikt in plaats van pointers, zoals, bijvoorbeeld, C # en Java.