给定一个包含两个整数作为节点的查询,是否在树中找到了这两个节点的所有子节点?

时间:2018-08-24 18:47:23

标签: algorithm tree tree-traversal

这是我的面试问题,具有以下问题说明

  

您将获得M个查询(1 <= M <= 100000),其中每个查询都有2个整数,它们充当某些树的节点。您将如何分别给出这2个节点的所有子级(子树)。

我的方法很幼稚。我为每个查询都使用了两个整数(节点)中的DFS,但访问员需要一些优化的方法。

更简单地说,我们必须打印查询中给定的节点子树,因此可能会有很多查询,因此我们不能在查询中的每个节点上运行DFS。

任何提示我该如何优化?

2 个答案:

答案 0 :(得分:0)

如果一个节点是另一个节点的子节点,则可以优化在两个节点上执行DFS的算法。

假定节点2是节点1的子级。在这种情况下,计算节点1上的DFS会获得节点2的所有子级,因此在2上再次运行DFS效率很低。您可以通过存储中间值来避免重新计算来实现此目的(请参见dynamic programming,特别是Fibonacci的示例,有关如何无法重新计算递归调用的值)

答案 1 :(得分:0)

对于单个查询,DFS应该是最佳方法。对于大量查询,以下是我可以做的一些事情:

  1. 缓存结果。当一个数字频繁出现(例如100次)时,将打印的子树保存到内存中,然后在再次出现相同的数字时返回结果。

  2. 缓存时,还要在原始树上标记缓存的子树中包含的所有节点。当查询包含这样的节点时,请参考缓存的子树而不是原始树,因为您也在这些节点上完成了DFS。

  3. 如@K所述。如果查询包含A且B且B是A的子代,则Dackow可以遍历A的树时直接使用B的DFS结果。如果允许,您甚至可以查询多个查询(例如10),看看是否存在是属于您正在遍历的当前子树的任何节点。您可以设置查询队列,并且在进行一次DFS遍历时,查看队列中的顶部项目以查看是否遇到任何节点。

希望这会有所帮助!

相关问题