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

时间:2014-01-27 17:19:40

标签: java algorithm data-structures tree

我接受了一次采访,我被问到如下问题:

  

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

我一直在考虑这个并想出一个解决方案:

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

3 个答案:

答案 0 :(得分:1)

你可以用简单的方式做到:

在N个节点的二叉树中将具有N-1个边。如果它具有循环,则具有N个节点的二叉树将具有多于N-1个边缘。

因此,如果no_of_nodes == no_of_edges-1,则需要计算节点和边的数量(parent-> child),而不是没有其他循环的循环。

希望你理解。

答案 1 :(得分:0)

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

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

识别树中循环的算法非常简单:

1)获取根节点

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

3)如果您访问已经访问过的节点,那么您有一个循环。增加你的循环计数器,回溯并转到2

答案 2 :(得分:0)

你需要:

  1. 检查图表已连接。
  2. 当你给出E边缘时,
  3. 检查是否有E + 1个顶点。
  4. 您可以应用Kruskal's algorithm来识别图表的已连接组件。应用它之后,您可以检查是否只有一个连接的组件,并且顶点的数量是E + 1.