reprezintă arbori binar de căutare în Python

voturi
5

Cum reprezint arbori binar de căutare în Python?

Întrebat 17/06/2010 la 04:19
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
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 - 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.

Publicat 17/06/2010 la 04:26
sursa de către utilizator

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