stellen binäre Suchbäume in Python

stimmen
5

Wie kann ich binäre Suchbäume in Python darstellen?

Veröffentlicht am 17/06/2010 um 04:19
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
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 - wie im Grunde in einer anderen Sprache, die Verweise eher als Zeiger (wie Java, C #, usw.) verwendet.

Bearbeiten :

Natürlich ist die Existenz sillywalkist dumm in die Tat, weil genau die gleiche Funktionalität ein einzelsträngige Liner externer Schnipsel auf dem ist walkMethode:

for x in tree.walk(): print(x.payload)

und mit walkIhnen kann fast jede andere Funktionalität auf dem Knoten-in-Ordnung - Stream erhalten, während mit sillywalk, können Sie einfach über Diddly-Squat erhalten. Aber, hey, sagt der OP yieldist „einschüchternd“ (Ich frage mich , wie viele von Python 2.6 Die anderen 30 Schlüsselwörter verdienen so erschrecken Worte in dem Urteil des OP -?) , So hoffe ich , printist es nicht!

Das ist alles völlig über die eigentliche Frage, auf repräsentieren BSTs: dass Frage ganz im beantwortet wird __init__- ein payloadAttribut der Knotens Nutzlast zu halten, leftund rightAttribut entweder zu halten None( das heißt, hat dieser Knoten keine Nachkommen auf dieser Seite) oder ein Node( der obere Teil des Zweiges von Nachkommen auf der entsprechenden Seite). Selbstverständlich ist die BST - Einschränkung , dass jeder linker Nachkomme von jedem Knoten (falls vorhanden) weniger eine Nutzlast hat oder gleich ist als die der betreffende Knoten, eine größere Nutzlast hat jedes Recht , einen (wiederum, falls vorhanden) - I hinzugefügt inserteinfach zu zeigen , wie trivial es diese Einschränkung zu halten ist, walk(und jetztsillywalk) Zu zeigen , wie trivial sie alle Knoten in aufsteigender Reihenfolge von Nutzlasten zu erhalten sind. Auch hier ist die allgemeine Idee auf den Weg gerade identisch würden Sie repräsentieren ein BST in jeder Sprache , welche Hinweise eher als Zeiger, wie zum Beispiel C # und Java verwendet.

Beantwortet am 17/06/2010 um 04:26
quelle vom benutzer

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