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













