Algorithm 从边缘构建树

Algorithm 从边缘构建树,algorithm,tree,edges,construct,Algorithm,Tree,Edges,Construct,我有棱角,我想用它建一棵树 问题是,只有当边按特定顺序排列时,我才能构造树结构。 订单示例: (vertex, parent_vertex) good: bad: (0, ) <-top (3, 2) (1, 0) (1, 0) (2, 1) (3, 2) (3, 2) (0, ) <-top 因此,对于新添加的顶点,树中必须始终存在父节点。 问题是如何对输入边进行排

我有棱角,我想用它建一棵树

问题是,只有当边按特定顺序排列时,我才能构造树结构。 订单示例:

(vertex, parent_vertex)

good:              bad:
(0,  ) <-top       (3, 2)
(1, 0)             (1, 0)
(2, 1)             (3, 2)
(3, 2)             (0,  ) <-top
因此,对于新添加的顶点,树中必须始终存在父节点。
问题是如何对输入边进行排序。Voices告诉我拓扑排序,但它是针对顶点的。有可能把它分类正确吗?

@mirt谢谢你指出我的方法的优化,你有更好的吗? 我将把下面的算法作为参考

首先构造一个散列映射来存储树中的元素:H,添加根(在您的例子中为null/或表示该根的任何内容)

获取配对(\u子项,\u父项)

  • 循环浏览整个列表。 在名单上。(每对都是元素)
  • 对于每一对,查看哈希映射H中是否有_子节点和_父节点,如果找不到,则为缺少的节点创建树节点并将它们添加到H中,并将它们与父子关系链接
  • 在迭代结束时,您将看到树

  • 复杂性是O(n)

    拓扑排序有什么问题?如果你对顶点排序,你的列表将是正确的。如果你有边,你就有树。你似乎唯一缺少的是关于哪个顶点是根的知识。一旦找到根(选择任意边并开始跟随父对象),我认为您要查找的是对树的一次预排序遍历。@Beta,是的,它似乎工作得很简单,我这样做了:将所有对放入哈希映射H中,并对其进行迭代。所以对于每一对(C,P),我在H中找到C和P并将它们绑定(将P设置为C的父项,将C添加为P的子项)。所以需要O(N)。
    result tree:
    
    0 - 1 - 2 - 3