Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以邻接列表形式表示的二叉树中的循环_Java_Algorithm_Data Structures_Tree - Fatal编程技术网

Java 以邻接列表形式表示的二叉树中的循环

Java 以邻接列表形式表示的二叉树中的循环,java,algorithm,data-structures,tree,Java,Algorithm,Data Structures,Tree,我获得了一次面试,面试中我被问到以下问题: 您将获得parent--->child关系,即N1---> N2其中N1是N2的父项。这只不过是代表一个 邻接列表形式的二叉树。所以我必须找出是否存在循环 我一直在考虑这个问题,并提出了一个解决方案: 只需检查单个节点,即N1,如果看到有边缘返回到N1,请尝试深入,然后打印。否则转到下一个节点。但是面试官告诉我这不是很有效,有人能帮我找到一个有效的解决方案吗。谢谢。树是一个图形。因此,您应该应用任何图形遍历算法,例如BFS(广度优先搜索)或DFS(深度

我获得了一次面试,面试中我被问到以下问题:

您将获得
parent--->child
关系,即
N1--->
N2
其中
N1
N2
的父项。这只不过是代表一个 邻接列表形式的二叉树。所以我必须找出是否存在循环

我一直在考虑这个问题,并提出了一个解决方案:


只需检查单个节点,即
N1
,如果看到有边缘返回到
N1
,请尝试深入,然后打印。否则转到下一个节点。但是面试官告诉我这不是很有效,有人能帮我找到一个有效的解决方案吗。谢谢。

树是一个图形。因此,您应该应用任何图形遍历算法,例如BFS(广度优先搜索)或DFS(深度优先搜索)

这两种算法都使用O(V)内存来存储顶点列表(V-#个顶点)并花费O(E)时间来完成(E-#个边,在V和V^2之间)。因此,基本上在这两种算法中,您需要一次探索所有边

识别树中循环的算法如下所示:

1) 扎根节点

2) 遍历图形(广度优先或深度优先),记住访问的节点


3) 如果您访问了一个已经访问过的节点,那么您就有了一个循环。增加循环计数器,回溯并转到2,您可以用一种简单的方式:

在由N个节点组成的二叉树中,节点将有N-1条边。如果它有循环,那么具有N个节点的二叉树将有N-1条以上的边

因此,如果nou_nodes==nou_of_edges-1,则需要计算节点和边的数量(父节点->子节点),而不是其他任何循环都有循环

希望你能理解

您需要:

  • 检查图形是否已连接
  • 当给定E边时,请检查是否确实存在E+1顶点

  • 您可以应用以标识图形的连接组件。应用它后,您可以检查是否只有一个连接的组件,以及顶点数是否为E+1。

    check@DarshanPatel此问题不同。检查一下。你不需要检查一下它是否连接了吗?@Anonymous无法找到你。