用单个后继者对树节点进行分组的算法

时间:2016-05-29 10:42:09

标签: algorithm tree grouping

我有一个如下图所示的图形数据结构。

Original Tree

将只有一个子节点的节点分组到一个节点中的算法是什么?例如,上面的树将转换为以下内容:

Modified Tree

图形可以包含任意长度的节点链,也可以自行循环。

1 个答案:

答案 0 :(得分:3)

以下递归算法可以解决您的问题。请注意,您的输入图形实际上不是树,而是DAG(但是,该算法也适用于DAG)。我假设您的DAG为topologically sorted,并且您将DAG的根提供给group函数。如果您的DAG未按拓扑排序,则应首先执行拓扑排序,可以使用DFS以线性时间进行。

group(dag_node):
   if dag_node.num_children == 0:
      new_node = new DagNode(dag_node.value)
   if dag_node.num_children > 1:
      new_node = new DagNode(dag_node.value)
      new_node.children = [group(child) for child in dag_node.children]
   if tree_node.num_children == 1:
      value_pair = (dag_node.value, dag_node.children[0].value)
      new_node = new DagNode(value_pair)
      new_node.children = dag_node.children[0].children
      new_node = group(new_node)
   return new_node