Jak mohu reprezentovat binární vyhledávací stromy v Pythonu?
představují binární vyhledávací stromy v Pythonu
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 - v podstatě jako v každém jiném jazyce, který používá odkazy, spíše než ukazatele (jako je Java, C #, etc).
Edit :
Samozřejmě, že samotná existence sillywalkje hloupé opravdu, protože přesně stejné funkce je singe-vložka vnější fragment v horní části walkmetody:
for x in tree.walk(): print(x.payload)
a walkmůžete získat jen o nějaké jiné funkce na toku uzly-in-pořadí, zatímco se sillywalkmůžete dostat jen o diddly-dřepu. Ale, hej, OP říká, že yieldje „odstrašující“ (Zajímalo by mě, kolik jiných Python 2.6 je 30 klíčových slov si zaslouží takové zděšení slova v úsudku OP -?), Takže doufám, že printne!
To vše je zcela mimo skutečné otázky, na které zastupují BSTs: že otázka je úplně zodpovězena __init__- s payloadatributem držet užitečné zatížení uzlu, lefta rightatribut uspořádat buď None(význam, tento uzel nemá potomky na této straně) nebo Node( horní část dílčího stromu potomků na příslušné straně). Samozřejmě, že BST omezení je, že každý levý potomek každého uzlu (pokud existuje) má užitečné zatížení menší nebo rovno než uzlu v pochybnost, každý pravý (opět, pokud existuje) má větší nosnost - jsem přidal insertjen ukázat, jak triviální je tvrdit, že omezení, walk(a nyní sillywalk), aby ukázala, jak triviální je dostat všechny uzly ve vzestupném pořadí uživatelských dat. Opět platí, že základní myšlenka je jen totožný s cestou, kterou zastupujete na BST v jakémkoli jazyce, který využívá odkazy, spíše než ukazatele, jako je například, C # a Java.













