假设我们有一个带有单个叶节点leafN
的DAG。每个节点都是包含父节点列表的对象。 Node类可以是class Node(Object, List[Node]
。
如何从leafN
构建DAG?
例如,给定带有两个父节点的叶节点leafD
,leafD(Object@123, List(leafC(leafA(null)), leafB(leafA(null))))
它的DAG将是:
leafA
/ \
leafB leafC
\ /
leafD
,即leafA(leafB(leafD(null)), leafC(leafD(null)))
(为了清楚起见,我忽略了每个节点的对象。)
简而言之,我们有一个带有父指针的叶子节点,它们本身有父指针,最后,在应用算法之后,我们想要一个 root 节点,其中包含指向子节点的指针,这些节点还有指向子节点的指针
不需要代码,算法或任何链接就足够了。
答案 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的更多解决方案。