我有一个树形结构,非常像DOM 我需要调试它并从循环引用中清除它(child是父项的父项) 我记得有一个算法,不记得名字 是什么名字。
答案 0 :(得分:4)
使用任何方便的算法走树;深度优先搜索通常是一个很好的候选人。跟踪您访问的每个节点。如果您访问节点两次,则可能存在圆形,可以通过删除通向重新访问节点的链接来破坏该特定圆形。但它可能只是一个连接,使树成为有向无环图(DAG)。 (见下图。)
如果您对DAG没有问题但没有圆形,那么您需要区分这两种情况。最简单的方法是为每个节点维护两个标志,而不是一个:visited
和completed
。在DFS上,您在访问子节点之前将节点标记为已访问,并在访问子节点后完成。 (如果它是一片叶子,只需给它两个标记。)现在,当您第一次访问节点时有三种可能性:
没有分数。不用担心。
已访问但尚未完成:循环
访问并完成:非循环钻石
最后一个案例看起来像这样:
root
/ \
/ \
/ \
a b
/ \ / \
/ \ / \
/ \/ \
c join d