解析展平的非二进制树节点列表

时间:2015-10-08 09:27:00

标签: python parsing tree

我有list个数据,其元素的结构如下:

(node_id, parent_node_id, children_node_ids, data)

或换句话说,它与此类似:

[(7, 2, [15, 23, 47], _data_), (15, 7, [64, 95, 123, 271, 272], _data_), ...]

因此,每个节点的子节点数是可变的。

'根节点'是parent_node_idNone的节点,例如:

(2, None, [4, 7, 9, 11], _data_)

并且,如示例中所示,'根节点'是隐藏的'在loooong列表中的某个地方。

我不知道为什么它的结构如此,但我必须使用它。

如何有效地将上面的列表解析为非二叉树?

我的天真'方法是创建一个自定义的非二进制树类,然后通过搜索根节点开始填充它,然后搜索它的子节点,然后递归搜索根的子节点......

但我想知道是否有更好的方法。

(一个目的是创建一个图形树以允许可视化。另一个目的是对数据进行排序,以便较低级别的节点始终位于较高级别节点的左侧。)

1 个答案:

答案 0 :(得分:0)

这就是我要做的事情:

class Node(object):
    def __init__(self, node_id, data):
        self.node_id = node_id
        self.data = data
        self.children = []

    def add_child(self, child):
        self.children.append(child)


def build_tree(raw_nodes):
    root = None
    nodes = {
        node_id: Node(node_id, data)
        for node_id, _, __, data in raw_nodes
    }
    for node_id, parent_id, children, __ in raw_nodes:
        node = nodes[node_id]
        for child_id in children:
            node.add_child(nodes[child_id])
        if parent_id is None:
            if root is not None:
                raise ValueError("Multiple root nodes found")
            else:
                root = node
    if root is None:
        raise ValueError("No root found")
    return root