Cum reprezint arbori binar de căutare în Python?
reprezintă arbori binar de căutare în Python
sursa de către utilizator Bunny Rabbit
În alte limbi...
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 - ca, practic, în orice altă limbă care utilizează referințe mai degrabă decât indicii (cum ar fi Java, C #, etc).
Editare :
Desigur, însăși existența sillywalkeste o prostie , într - adevăr, pentru că exact aceeași funcționalitate este un fragment extern pârli-linie în partea de sus a walkmetodei:
for x in tree.walk(): print(x.payload)
și cu walkputeți obține doar despre orice altă funcționalitate pe fluxul de noduri-in-ordine, în timp ce, cu sillywalk, puteți obține doar despre diddly-ghemuit. Dar, hei, OP spune ca yieldeste „intimidare“ (Mă întreb cât de mulți dintre Python 2.6 de alte 30 de cuvinte cheie merită astfel de cuvinte sperie în opinia PO -?) , Așa că eu sunt în speranța printnu este!
Acest lucru este complet dincolo de întrebarea reală, pe reprezentând BSTs: acea întrebare se răspunde în întregime în __init__- un payloadatribut de a deține sarcină utilă nodului, leftși rightatribuie să dețină fie None(sens, acest nod nu are descendenti pe acea parte) sau o Node( în partea de sus a sub-arborele descendenți pe latura corespunzătoare). Desigur, constrângerea BST este că fiecare descendent stâng al fiecărui nod (dacă există) are o sarcină utilă mai mică sau egală decât cea a nodului în cauză, fiecare din dreapta (din nou, dacă este cazul) are o sarcină utilă mai mare - am adăugat insertdoar pentru a arăta cât de banal este de a menține acea constrângere, walk(și acum sillywalk) pentru a arăta cât de banal este de a obtine toate nodurile în ordinea crescătoare sarcini utile. Din nou, ideea generală este doar identic cu modul în care ar reprezenta o BST în orice limbă care utilizează referințe mai degrabă decât indicii, cum ar fi, de exemplu, C # și Java.