Почему бы просто не иметь класс для узлов, который имеет список дочерних узлов?
Изменить, чтобы добавить скелет:
class TreeNode(object):
def __init__(self, data, children=[]):
self.data = data
self.children = list(children)
def add(self, child):
self.children.append(child)
...
Там на самом деле не так много. Каждый TreeNode содержит набор дочерних узлов (конечные узлы просто имеют 0 дочерних элементов, что примерно так же близко к реализации в чистом коде самого определения листового узла дерева, как вы можете получить). Вы можете добавить методы для управления порядком дочерних элементов, но если вам нужно, возможно, вам будет лучше, если вы просто рассмотрите список children
и будете использовать методы списка напрямую. Вы можете добавить такие методы, как search
, но для общего дерева без известных ограничений упорядочения (как в бинарном дереве поиска, где содержимое одного поддерева меньше содержимого другого поддерева), для него не так уж много делать. Вы можете добавить методы генератора для обхода (с несколькими возможными стратегиями обхода).
Если вы хотите, чтобы только конечные узлы имели данные, то у вас есть отдельный класс для внутренних узлов и конечных узлов, где внутренние узлы имеют children
, а конечные узлы имеют data
.