rappresentare alberi binari di ricerca in pitone

voti
5

come faccio io rappresento alberi binari di ricerca in Python?

È pubblicato 17/06/2010 alle 04:19
fonte dall'utente
In altre lingue...                            


1 risposte

voti
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()

ecc, ecc - praticamente come in qualsiasi altra lingua che utilizza i riferimenti piuttosto che puntatori (come Java, C #, ecc).

Edit :

Naturalmente, l'esistenza di sillywalkè stupido infatti, perché esattamente la stessa funzionalità è un frammento esterna singe-liner in cima al walkmetodo:

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

e con walkvoi possono ottenere praticamente qualsiasi altra funzionalità del flusso nodi-in-ordine, mentre, con sillywalk, è possibile ottenere quasi diddly-squat. Ma, hey, l'OP dice yieldè "intimidatoria" (mi chiedo quanti di Python 2.6 di altri 30 parole chiave meritano tali parole intimidatorie a giudizio del PO -?) Quindi spero printnon lo è!

Questo è tutto completamente oltre la domanda attuale, il che rappresentano BST: che domanda è interamente soluzione __init__- un payloadattributo di tenere payload del nodo, lefte rightattribuire a detenere None(significato, questo nodo non ha discendenti da quel lato) o un Node( all'inizio della sottoalbero dei discendenti dal lato corrispondente). Naturalmente, il vincolo BST è che ogni discendente fianco di ogni nodo (se presente) ha un carico utile inferiore o uguale a quella del nodo in questione, ognuno a destra (ancora una volta, se ce ne sono) ha un maggior carico utile - ho aggiunto insertsolo per mostrare come banale è quello di mantenere tale vincolo, walk(e orasillywalk) Per mostrare come banale è quello di ottenere tutti i nodi in ordine di carichi utili in aumento. Anche in questo caso, l'idea generale è proprio identico al modo in cui ci si dichiara un BST in qualsiasi lingua che utilizza i riferimenti invece di puntatori, come, ad esempio, C # e Java.

Risposto il 17/06/2010 a 04:26
fonte dall'utente

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