come faccio io rappresento alberi binari di ricerca in Python?
rappresentare alberi binari di ricerca in pitone
fonte dall'utente Bunny Rabbit
In altre lingue...
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.