representere binære søketrær i python

stemmer
5

Hvordan kan jeg representere binære søketrær i python?

Publisert på 17/06/2010 klokken 03:19
kilden bruker
På andre språk...                            


1 svar

stemmer
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 - 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.

Svarte 17/06/2010 kl. 03:26
kilden bruker

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