【发布时间】:2014-01-08 18:55:47
【问题描述】:
您好,我是 OOP 的新手,所以在阅读本文时请记住这一点。
我有一个简单的 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() 方法。
我想到的一些解决方案是
- 在
__init__方法中创建self.leaf_nodes = []。通过这样做,我知道它只会被这个树实例看到。 - 在
__init__方法之上创建一个类成员leaf_nodes = []。通过这样做,我知道所有树实例都将能够看到 leaf_nodes 列表。
上述解决方案将导致我在我的类中创建一个leaf_nodes 列表,以便get_leaf_nodes() 方法可以使用。我正在寻找的是只有一个get_leaf_nodes() 方法可以在我的树上进行计算并返回一个列表。
例如,在 C 语言中,我们会调用 malloc(),然后我们可以返回指向调用 get_leaf_nodes() 的函数的指针。
【问题讨论】:
-
通常你使用递归来解决这个问题。 stackoverflow.com/questions/479343/…
-
我知道递归。我也已经在 preorder_trav() 方法中使用了它。问题是我遇到的 OO 设计问题。我是否必须在我的类中创建一个列表,或者有一种方法可以返回叶节点列表而不在 init 中创建一个或作为类成员?