представляют собой бинарные деревья поиска в питона

голоса
5

как я представления двоичных деревьев поиска в Python?

Задан 17/06/2010 в 04:19
источник пользователем
На других языках...                            


1 ответов

голоса
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()

и т.д., и т.д. - в основном, как и в любом другом языке, который использует ссылки, а не указатели (например, Java, C #, и т.д.).

Edit :

Конечно, само существование sillywalkглупо на самом деле, потому что точно такой же функциональности является опаляться вкладыш внешний фрагмент поверх walkметода:

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

и walkвы можете получить только о каких - либо других функций на потоке узлов-в-порядке, в то время как, с sillywalk, вы можете получить только о Diddly-присед. Но, эй, ОП говорит yieldэто «пугающее» (Интересно , сколько из Python 2.6 в других 30 ключевых слов заслуживают таких дефицитных слов в суждении ФПА в -?) , Так что я надеюсь , что printэто не так !

Это все полностью за актуальный вопрос, на представляющих BSTs: что вопрос полностью отвечал в __init__- в payloadатрибуте для хранения полезной нагрузки этого узла, leftи rightприписывать держать либо None(смысл, этот узел не имеет потомков на той стороне) или Node( в верхней части суб-дерева потомков на соответствующей стороне). Конечно, BST ограничение в том , что каждый левый потомок каждого узла (если таковые имеются) имеет грузоподъемность меньше или равно , чем у рассматриваемого узла, каждый правый (один раз, если таковые имеются) имеет большую полезную нагрузку - я добавил insertтолько чтобы показать , как тривиально, чтобы поддерживать это ограничение, walk(а теперьsillywalk) , Чтобы показать , как тривиально, чтобы получить все узлы в порядке возрастания полезных нагрузок. Опять же , общая идея просто идентично тому, как вы бы представлять собой BST на любом языке , который использует ссылки , а не указатели, как, например, C # и Java.

Ответил 17/06/2010 в 04:26
источник пользователем

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