представление бинарных деревьев поиска в python
Как я представляю бинарные деревья поиска в python?
1 ответ:
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Вы можете получить практически любую другую функциональность в потоке nodes-in-order, в то время как с помощьюsillywalkВы можете получить только ничего. Но, эй, ОП говорит, чтоyieldявляется "пугающим" (интересно, сколько из других 30 ключевых слов Python 2.6 заслуживают таких пугающих слов в суждении ОП?- ) так что я надеюсь, чтоЭто все полностью выходит за рамки фактического вопроса, на представляющем BSTs: что вопрос полностью отвечает в
__init__- Apayloadатрибут для хранения полезной нагрузки узла,leftиrightатрибут для хранения либоNone(это означает, что этот узел не имеет потомков на этом сторона) илиNode(вершина поддерева потомков на соответствующей стороне). Конечно, ограничение BST состоит в том, что каждый левый потомок каждого узла (если таковой имеется) имеет полезную нагрузку меньше или равна полезной нагрузке рассматриваемого узла, каждый правый (опять же, если таковая имеется) имеет большую полезную нагрузку-я добавилinsertпросто для того, чтобы показать, насколько тривиально поддерживать это ограничение,walk(а теперьsillywalk), чтобы показать, насколько тривиально получить все узлы в порядке возрастания полезной нагрузки. Опять же, общая идея просто идентично тому, как вы представляете BST в любом языке, который использует ссылки, а не указатели, как, например, C# и Java.