给定叶节点创建DAG

时间:2015-02-26 10:52:27

标签: algorithm directed-acyclic-graphs

假设我们有一个带有单个叶节点leafN的DAG。每个节点都是包含父节点列表的对象。 Node类可以是class Node(Object, List[Node]

如何从leafN构建DAG?

例如,给定带有两个父节点的叶节点leafDleafD(Object@123, List(leafC(leafA(null)), leafB(leafA(null))))它的DAG将是:

    leafA
   /     \
 leafB  leafC
    \    /
    leafD

,即leafA(leafB(leafD(null)), leafC(leafD(null)))(为了清楚起见,我忽略了每个节点的对象。)

简而言之,我们有一个带有父指针的叶子节点,它们本身有父指针,最后,在应用算法之后,我们想要一个 root 节点,其中包含指向子节点的指针,这些节点还有指向子节点的指针

不需要代码,算法或任何链接就足够了。

2 个答案:

答案 0 :(得分:0)

您需要做的就是将您的节点放入一些数据结构中,以便您轻松找到节点。如果你的节点中的整数值是顺序的(或接近它)并从较低的数字开始,那么你可以使用一个数组,只需将整数i的节点放在数组的位置i(这样就可以在节点中包含整数)有点多余)。

这一点在本网站上都得到了很好的解释(但请注意,在它们的实现中,列表是边缘,而不是边缘)http://algs4.cs.princeton.edu/42directed/

答案 1 :(得分:0)

这很简单,一旦你意识到只有DAG中边缘的方向发生了变化。

而不是Parent ---> Child节点关系,您有Child ---> Parent关系。

因此,您需要做的就是从给定的关系构造DAG,假设Child节点实际上是父节点,父节点是子节点。

所以你最终得到了

    leafD
   ↙     ↘
 leafB  leafC
   ↘     ↙
    leafA

现在,您需要做的就是反转DAG中的边缘。

这很简单,一种方法是遍历DAG,获得所有边缘关系,然后逐个反转。

另一种方法是使用级别顺序遍历递归执行此操作。

检查this question以获取有关如何撤消DAG的更多解决方案。