Data structures 如何验证树中是否有圆?

Data structures 如何验证树中是否有圆?,data-structures,directed-graph,directed-acyclic-graphs,Data Structures,Directed Graph,Directed Acyclic Graphs,这是一棵树: 将有一个根 每个树节点都有零个或多个子节点 允许两个节点指向同一个子节点。比如说,两个节点都是A节点 节点B具有子节点C 但禁止, 节点A是节点B的后代,并且 节点B是节点A的后代 一个被禁止的案例是 节点A有一个子节点C和节点D 节点C和D都有一个子节点E 节点E具有a的子节点 问题是,如何以最快的方式确定这个圆 更新:我意识到这是在有向图中查找任何循环。刚才我设法想出了一个类似于Tarjan算法的解决方案 感谢您的评论。可以使用两个指针找到圆圈,并以不同的间隔前进。最终指

这是一棵树:

  • 将有一个根

  • 每个树节点都有零个或多个子节点

  • 允许两个节点指向同一个子节点。比如说,两个节点都是A节点 节点B具有子节点C

  • 但禁止,

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

    一个被禁止的案例是

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

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

    节点E具有a的子节点

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

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


    感谢您的评论。

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

    可以用两个指针找到圆圈,并以不同的间隔前进。最终指针将匹配,指示循环,或者“更快”的指针将到达然后结束。这个问题通常是问链表,而不是树。

    对树做一个分析。如果在回溯堆栈中的任何一点上发现一个节点,则会有一个圆。

    在树中进行一次遍历。如果在任何一点上,您发现一个节点已经在回溯堆栈中,则存在一个圆。

    这在图论中称为“循环”(而不是圆)。您正在尝试验证给定图是否为“有向无环图”或简称DAG。此外,这里已经提出并回答了这个问题:您的数据结构是一个有向图,而不是一棵树。树节点不能有多个父节点。这在图论中称为“循环”(而不是圆)。您正在尝试验证给定图是否为“有向无环图”或简称DAG。此外,这里已经提出并回答了这个问题:您的数据结构是一个有向图,而不是一棵树。树节点不能有多个父节点。我不确定这是否是最快的方式,而是内存开销最低的方式。另外,对一棵树来说,这听起来很复杂。对于一个链表来说,这个问题很容易解决。但是考虑这个问题——树会有多个末端。相反,链表只有一端。是的。。。这就是为什么我说这个问题通常是问列表,而不是树。您必须使用队列为树的每个节点运行此操作,以记住每个节点的“下一个”节点作为新的起点。这会很难看。我不确定这是否是最快的方式,而是内存开销最低的方式。另外,对一棵树来说,这听起来很复杂。对于一个链表来说,这个问题很容易解决。但是考虑这个问题——树会有多个末端。相反,链表只有一端。是的。。。这就是为什么我说这个问题通常是问列表,而不是树。您必须使用队列为树的每个节点运行此操作,以记住每个节点的“下一个”节点作为新的起点。这会很难看。在这种情况下,它将失败:A->B,B->C,A->C对不起,它应该读取“stack”而不是“parent.Fixed”。因为会有节点可以通过多条路径访问而不创建循环(想想A->(B,C)->d)一个简单的BFS实现将检测到误报。在这种情况下,它将失败:a->B,B->C,a->Csorry,应该读取“stack”而不是“parent”。修复了它。因为会有节点可以通过多条路径到达,而无需创建一个循环(想想a->(b,c)->d),一个简单的BFS实现将检测到误报。