使用python获取二叉树中给定级别上的所有节点

使用python获取二叉树中给定级别上的所有节点,python,tree,binary,Python,Tree,Binary,我试图在python二叉树中获取节点列表(objetcs),我在寻找在node对象中实现的递归函数,因此我将调用根节点上的函数,它将在childs节点上运行,直到达到特定级别,然后将在列表中返回这些节点 我目前的做法是,我不确定这是正确的还是最好的实施方式: def get_level_nodes(self, nodes, level=1): if self.level > level: return nodes if self.level == level

我试图在python二叉树中获取节点列表(objetcs),我在寻找在node对象中实现的递归函数,因此我将调用根节点上的函数,它将在childs节点上运行,直到达到特定级别,然后将在列表中返回这些节点

我目前的做法是,我不确定这是正确的还是最好的实施方式:

def get_level_nodes(self, nodes, level=1):
    if self.level > level:
        return nodes
    if self.level == level:
        nodes.append(self)
        return nodes
    for child in self.child_id:
        nodes += child.get_level_nodes(node, level)
    return nodes

# Getting the list
nodes_list = root_node.get_level_nodes([], 3)

实际上不需要传递节点列表。每个节点只需返回其自身子树的适当级别节点,并将相邻节点的组合留给父节点:

def get_level_nodes(self, level=1):
    if self.level > level:
        return []
    if self.level == level:
        return [self]
    # child_id seems an odd name
    return [n for c in self.children for n in c.get_level_nodes(level)]
不为每个子树构建中间列表的更节省空间的实现是生成器函数:

def get_level_nodes(self, level=1):
    if self.level > level:
        return
    if self.level == level:
        yield self
    else:
        for c in self.children:
            for n in c.get_level_nodes(level):
                yield n
            # or in Python3
            # yield from c.get_level_nodes(level)


nodes_list = list(root_node.get_level_nodes(3))

谢谢,我正在寻找实现的kiind,而不是将列表作为参数。第一种方法对我来说很好,因为我使用的是Python2.7,而您的第二种解决方案只兼容Python3.3+@ArthurReinhart-Yup,应该提到这一点。我添加了一个Python2版本的生成器实现。再次感谢@schwobasegl,我以前没有使用过生成器,只是因为您的建议,我一直在学习它们。我在这里学到了很多