我有一个由 (Parent1 -> Child1), (Parent2 -> Child2), ...., (ParentN -> ChildN) 元组描述的有向无环图(树)。是否有任何算法可以根据这些信息重建树(图)?

一个更好的例子:

Root
  Parent1
     Node1
       Child1
       Child2
  Parent2
     Node1
       Child1
       Child2

作为输入,我只有:
Root -> Parent1
Node1 -> Child1
Root -> Parent2
Parent1 -> Node1
Parent2 -> Node1
Node1 -> Child2

没有特别的顺序。

只有这些元组,我们可以在如下结构中重建树:

节点(名称:字符串, child :列表)?

最佳答案

从根开始执行深度优先遍历,允许多次访问节点(当然,图必须是非循环的才能终止)。对于你访问的每一个图节点,你创建一个对应的树节点,并将其连接到其父图节点对应的树节点( 编辑: 其实,一个图节点可以对应多个树节点,你有兴趣最后)。

例如,假设您的根是 A :

    A
   / \
  /   \
 B     C
  \   /
   \ /
    D

您访问 A ,创建 tA 。遍历到 B,您创建 tB ,将其连接到 tA 。然后访问 'D',创建 tD ,将其连接到 tB ,然后回溯并访问 'C',创建 tC 并将其连接到 tA ,这样你就得到了这棵树:
    tA
   / \
  /   \
 tB   tC
 |    |
 |    |
 tD   tD'

请注意,通过这种转换,与图相比,您可能会得到一个指数级更大的树。

关于algorithm - 将元组转换为树,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4045997/

10-13 07:40