我有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_id
为None
的节点,例如:
(2, None, [4, 7, 9, 11], _data_)
并且,如示例中所示,'根节点'是隐藏的'在loooong列表中的某个地方。
我不知道为什么它的结构如此,但我必须使用它。
如何有效地将上面的列表解析为非二叉树?
我的天真'方法是创建一个自定义的非二进制树类,然后通过搜索根节点开始填充它,然后搜索它的子节点,然后递归搜索根的子节点......
但我想知道是否有更好的方法。
(一个目的是创建一个图形树以允许可视化。另一个目的是对数据进行排序,以便较低级别的节点始终位于较高级别节点的左侧。)
答案 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