vertegenwoordigen binaire zoekboom in python

stemmen
5

Hoe kan ik vertegenwoordigen binaire zoekboom in python?

De vraag is gesteld op 17/06/2010 om 04:19
bron van user
In andere talen...                            


1 antwoorden

stemmen
11

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.

antwoordde op 17/06/2010 om 04:26
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more