如何在树中查找循环引用

时间:2015-02-13 15:01:38

标签: algorithm architecture tree graph-algorithm

我有一个树形结构,非常像DOM 我需要调试它并从循环引用中清除它(child是父项的父项) 我记得有一个算法,不记得名字 是什么名字。

1 个答案:

答案 0 :(得分:4)

使用任何方便的算法走树;深度优先搜索通常是一个很好的候选人。跟踪您访问的每个节点。如果您访问节点两次,则可能存在圆形,可以通过删除通向重新访问节点的链接来破坏该特定圆形。但它可能只是一个连接,使树成为有向无环图(DAG)。 (见下图。)

如果您对DAG没有问题但没有圆形,那么您需要区分这两种情况。最简单的方法是为每个节点维护两个标志,而不是一个:visitedcompleted。在DFS上,您在访问子节点之前将节点标记为已访问,并在访问子节点后完成。 (如果它是一片叶子,只需给它两个标记。)现在,当您第一次访问节点时有三种可能性:

  1. 没有分数。不用担心。

  2. 已访问但尚未完成:循环

  3. 访问并完成:非循环钻石

  4. 最后一个案例看起来像这样:

               root
                / \
               /   \
              /     \
              a      b
             / \    / \
            /   \  /   \
           /     \/     \
          c     join     d