python - 如何使用 Python 获取树的叶节点?

标签 python oop tree

大家好,我是 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() 方法。

我想到的一些解决方案是

  1. __init__ 方法中制作一个 self.leaf_nodes = []。通过这样做,我知道它只会被这个树实例看到。
  2. __init__ 方法之上创建一个类成员 leaf_nodes = []。通过这样做,我知道所有树实例都将能够看到 leaf_nodes 列表。

上述解决方案将使我在我的类中创建一个 leaf_nodes 列表,以便 get_leaf_nodes() 方法可以使用。我正在寻找的是只有一个 get_leaf_nodes() 方法可以对我的树进行计算并返回一个列表。

例如,在 C 中我们会调用 malloc(),然后我们可以返回指向调用 get_leaf_nodes() 的函数的指针。

最佳答案

在 python 中,您可以使用内部函数来收集叶节点,然后返回它们的列表。

def get_leaf_nodes(self):
    leafs = []
    def _get_leaf_nodes( node):
        if node is not None:
            if len(node.children) == 0:
                leafs.append(node)
            for n in node.children:
                _get_leaf_nodes(n)
    _get_leaf_nodes(self.root)
    return leafs

如果您想要一种更干净的 OOP 方法,您可以为叶子集合创建一个额外的私有(private)方法:

def get_leaf_nodes(self):
    leafs = []
    self._collect_leaf_nodes(self.root,leafs)
    return leafs

def _collect_leaf_nodes(self, node, leafs):
    if node is not None:
        if len(node.children) == 0:
            leafs.append(node)
        for n in node.children:
            self._collect_leaf_nodes(n, leafs)

这就是我在 Java 中的做法。

关于python - 如何使用 Python 获取树的叶节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21004181/

相关文章:

python - 打破 Python 中的嵌套(双)循环

c++ - 点迭代器的奇怪接口(interface)方法

c# - Linq2Sql、OOP、DependencyInjection问题

algorithm - Splay Trees中节点的插入和删除

python - 从列表 os 文件路径构建树 (Python) - 性能依赖

xml - Scala:获取 XML 中的所有叶节点及其路径的最简单方法是什么?

python - 成员在 __init__() 和其他方法中的初始化工作方式不同

python - 将一个 csv 中的列添加到另一个 csv

python - Scrapy 输出 [ 到我的 .json 文件中

php - 为什么可以通过引用从外部类访问私有(private)变量?