Привет, я новичок в ООП, поэтому имейте это в виду, пока вы читаете это.Как получить листовые узлы дерева с помощью Python?
У меня есть простая реализация дерева Python (см. Ниже код).
class TreeNode(object):
def __init__(self, data):
self.data = data
self.children = []
def add_child(self, obj):
self.children.append(obj)
class Tree:
def __init__(self):
self.root = TreeNode('ROOT')
def preorder_trav(self, node):
if node is not None:
print node.data
if len(node.children) == 0:
print "("+ node.data + ")"
for n in node.children:
self.preorder_trav(n)
if __name__ == '__main__':
tr = Tree()
n1 = tr.root
n2 = TreeNode("B")
n3 = TreeNode("C")
n4 = TreeNode("D")
n5 = TreeNode("E")
n6 = TreeNode("F")
n1.add_child(n2)
n1.add_child(n3)
n2.add_child(n4)
n2.add_child(n5)
n3.add_child(n6)
tr.preorder_trav(n1)
Теперь мне нужно реализовать метод получения листов листьев. Под термином листовой узел Я имею в виду узел, у которого нет детей.
Мне интересно, как сделать get_leaf_nodes() метод.
Некоторые решения приходят на мой взгляд, являются
- Создание
self.leaf_nodes = []
внутри метода__init__
. Сделав это, я знаю, что это увидит только этот экземпляр дерева. - Изготовление класса
leaf_nodes = []
над__init__
способ. Сделав это, я знаю, что все экземпляры дерева смогут увидеть список leaf_nodes.
Вышеупомянутые решения заставят меня создать список leaf_nodes внутри моего класса, чтобы использовать метод get_leaf_nodes()
. Я ищу только метод get_leaf_nodes()
, который будет выполнять вычисления на моем дереве и вернет список.
Например, в C мы будем называть malloc()
, а затем мы можем вернуть указатель на функцию, которая называется get_leaf_nodes()
.
Обычно вы используете рекурсию для решения этой проблемы. http://stackoverflow.com/questions/479343/how-can-i-build-a-recursive-function-in-python –
Я знаю о рекурсии. Я использовал его уже в preorder_trav(). Дело в том, что проблема дизайна OO у меня есть. Должен ли я создавать список внутри моего класса или есть способ вернуть список листовых узлов, не делая его внутри __init__ или как член класса? – limitcracker