建造一棵树“向后”

时间:2012-04-15 11:03:53

标签: python

我需要在Python中创建一个类似树的结构。我有一个函数get(parentId),它返回一个包含该父对象的对象列表 - 我认为应该以递归方式完成。

结果应该是这样的:["root object", ["child1 of root", "child2 of root", ["child2-1", "child2-2"]]]

每个对象都有一个parent属性,它是get()的parentId,但作为一个起点,我只有root对象。

2 个答案:

答案 0 :(得分:1)

树有一个标准数据结构,它不是列表列表。

制作一个课程Node,其中包含children的属性list(或set,如果您不关心顺序)“子节点” 。还要创建一个方法add_child,它接受​​一个节点,设置该节点的parent,并将其添加到children列表中。类似的东西:

class Node(object):
    def __init__(self, children={}):
        self.parent = None
        self.children = children

    def add_child(self, child):
        child.parent = self
        self.children.add(child)

要走树,只需要询问root的子项,然后是子项等。这可以递归完成,但为了提高速度和内存效率,您可能希望在Python中迭代执行。

def walk(root):
    yield root
    for child in root.children:
        for elt in walk(child):
            yield elt

当然,这已经做过很多次了,所以你不应该自己写,除非是作业或学习练习。

由于HTML / XML文档的结构类似于树,因此您应该使用众多DOM树库中的一个作为实际数据结构。试试xml.dom.minidomlxml

答案 1 :(得分:1)

假设你仍然对树的列表表示感兴趣(这不一定是无用的事情),这是一个递归函数定义,我相信你需要做的事情(假设get()函数确实已经定义过:)

def build_tree(node):
    return [node,[build_tree(child) for child in get(node)]]

你可以用类似的方式使用它:

root = 1  # or whatever other representation you may use for root
list = build_tree(root)
print list