Вопрос

Как я могу представлять двоичные валы поиска в Python?

Это было полезно?

Решение

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 и т. Д. - в основном нравится на любом другом языке, который использует ссылки, а не указатели (такие как Java, C #, и т. Д.).

Редактировать:

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top