我试图找到一个合适的算法来解决这个问题:假设我有一些(定向图)节点。每个节点可能有或没有父节点(最多意味着一个父节点)。假设节点的这种表示法:(id,id_parent)。一些节点将是(id_i,NULL),而将有节点(id_j,id_i)作为" sons" id_i。以特定顺序拥有这些节点的数组,我想按照这个顺序对它们进行排序:儿子的儿子儿子的父子儿等等。
示例:节点(1,NULL),(2,NULL),(3,1),(4,3),(5,2),(6,3)
排序的数组将是:(1,NULL),(3,1),(4,3),(6,3),(2,NULL),(5,2)。一种深入的树木探索。
哪种算法适合实现这一目标?感谢
答案 0 :(得分:2)
如果图表没有周期 - 它是DAG,您正在寻找topoloical sort。
如果它有循环 - 没有这样的排序,因为在循环中,会有一个节点,它的儿子也是它的祖先。
编辑:
如果图形是一个森林(树木的不相交联合) - 那么来自源的简单DFS就可以了。只需构造图形(排序为O(nlogn)
,如果尚未排序,或O(n)
使用radix sort),找到源列表,并从每个源执行DFS,每次访问节点时,都将其存储在输出数组中。在有未被发现的顶点的情况下迭代。