如何验证树中是否有圆圈?

时间:2010-02-17 13:47:21

标签: data-structures directed-graph directed-acyclic-graphs

这是一棵树:

  
      
  1. 会有一个根。

  2.   
  3. 每个树节点都有零个或多个子节点。

  4.   
  5. 允许两个节点指向同一个子节点。比如,节点A   节点B有子C。

  6.   

但是,禁止这样做,

  

节点A是节点B的后代,并且   节点B是节点A的后代。

一个被禁止的案例是

  

节点A有一个子节点C和节点D,

     

节点C和D都有一个子节点E,

     

节点E的孩子为A。

问题是,如何以最快的方式确定这个圈子?

更新:我意识到这是在有向图中找到任何循环。刚才我设法想出了一个类似于Tarjan算法的解决方案。

感谢您的评论。

2 个答案:

答案 0 :(得分:5)

通过树做Depth First Search。如果您在任何时候发现已经在回溯堆栈中的节点,则会有一个圆圈。

答案 1 :(得分:0)

圆圈可以使用2个指针找到并以不同的间隔推进它们。最终指针将匹配,表示循环,或“更快”的指针将到达然后结束。问题通常是链接列表,而不是树木。