这是我的面试问题,具有以下问题说明
您将获得M个查询(1 <= M <= 100000),其中每个查询都有2个整数,它们充当某些树的节点。您将如何分别给出这2个节点的所有子级(子树)。
我的方法很幼稚。我为每个查询都使用了两个整数(节点)中的DFS,但访问员需要一些优化的方法。
更简单地说,我们必须打印查询中给定的节点子树,因此可能会有很多查询,因此我们不能在查询中的每个节点上运行DFS。
任何提示我该如何优化?
答案 0 :(得分:0)
如果一个节点是另一个节点的子节点,则可以优化在两个节点上执行DFS的算法。
假定节点2是节点1的子级。在这种情况下,计算节点1上的DFS会获得节点2的所有子级,因此在2上再次运行DFS效率很低。您可以通过存储中间值来避免重新计算来实现此目的(请参见dynamic programming,特别是Fibonacci的示例,有关如何无法重新计算递归调用的值)
答案 1 :(得分:0)
对于单个查询,DFS应该是最佳方法。对于大量查询,以下是我可以做的一些事情:
缓存结果。当一个数字频繁出现(例如100次)时,将打印的子树保存到内存中,然后在再次出现相同的数字时返回结果。
缓存时,还要在原始树上标记缓存的子树中包含的所有节点。当查询包含这样的节点时,请参考缓存的子树而不是原始树,因为您也在这些节点上完成了DFS。
如@K所述。如果查询包含A且B且B是A的子代,则Dackow可以遍历A的树时直接使用B的DFS结果。如果允许,您甚至可以查询多个查询(例如10),看看是否存在是属于您正在遍历的当前子树的任何节点。您可以设置查询队列,并且在进行一次DFS遍历时,查看队列中的顶部项目以查看是否遇到任何节点。
希望这会有所帮助!