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

Algorithm 给定一个包含两个整数作为节点的查询,在树中查找这两个节点的所有子节点?,algorithm,tree,tree-traversal,Algorithm,Tree,Tree Traversal,这是我的面试问题,问题陈述如下 给您M个查询(1如果其中一个节点是另一个节点的子节点,您可以优化在两个节点上执行DFS的算法 假设节点2是节点1的子节点。在这种情况下,计算节点1上的DFS将获得节点2的所有子节点,因此在节点2上再次运行DFS是低效的。可以通过存储中间值来实现这一点,以避免重新计算(请参阅Fibonacci的示例,特别是关于如何不能重新计算递归调用的值)对于单个查询,DFS应该是最佳方式。对于大量查询,我认为您可以做以下几件事: 缓存结果。当一个数字频繁出现(比如100次)时,将

这是我的面试问题,问题陈述如下


给您M个查询(1如果其中一个节点是另一个节点的子节点,您可以优化在两个节点上执行DFS的算法


假设节点2是节点1的子节点。在这种情况下,计算节点1上的DFS将获得节点2的所有子节点,因此在节点2上再次运行DFS是低效的。可以通过存储中间值来实现这一点,以避免重新计算(请参阅Fibonacci的示例,特别是关于如何不能重新计算递归调用的值)

对于单个查询,DFS应该是最佳方式。对于大量查询,我认为您可以做以下几件事:

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

  • 缓存时,还要在原始树上标记缓存子树中包含的所有节点。当查询包含此类节点时,请参考缓存子树而不是原始树,因为您也对这些节点执行了DFS

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


  • 希望这有帮助!

    你专门为它设计了什么算法?你能放一些代码或伪代码吗?查找或计数?还有,这两个节点的子节点是什么?两个集的交集?@K.Dackow我只是对每个有2个整数或节点的查询使用简单DFS,并对每个查询运行DFS,收集其子树。@juvian,它的simp两个节点都有一个完整的子树。所以它与单个节点的2*M查询相同?我不明白为什么会给出2。如果需要为每个查询提供整个子树作为答案,dfs是最优的