Algorithm 树的时间高效算法

Algorithm 树的时间高效算法,algorithm,data-structures,tree,Algorithm,Data Structures,Tree,我需要一个能有效解决以下问题的算法: 给定一棵非二叉树,最多有200000条边和3个节点x、y、z。编写一个算法,如果y位于x和z的路径中或z位于x和y的路径中,则返回true。查询的数量为10^5 看起来很简单。因为它是一棵树,要测试x->y->z,从z开始,然后遍历到树的根。类似地,要测试x->z->y,从y开始,然后遍历到树的根。当然,您可以同时从z和y开始,向上遍历树的根,直到您发现两个路径条件中的任何一个都满足,或者您发现一个矛盾的信息,例如“z”和“y”属于“x”的两个不同分支,或者

我需要一个能有效解决以下问题的算法:

给定一棵非二叉树,最多有200000条边和3个节点x、y、z。编写一个算法,如果y位于x和z的路径中或z位于x和y的路径中,则返回true。查询的数量为10^5


看起来很简单。因为它是一棵树,要测试x->y->z,从z开始,然后遍历到树的根。类似地,要测试x->z->y,从y开始,然后遍历到树的根。当然,您可以同时从z和y开始,向上遍历树的根,直到您发现两个路径条件中的任何一个都满足,或者您发现一个矛盾的信息,例如“z”和“y”属于“x”的两个不同分支,或者即使一直遍历到根,也找不到x


这种简单算法的最坏情况是,当您有一个完全线性的树,每个节点只有一个子节点时,例如x是根,y是距离x的100000条边,即中间,z是叶。我不确定10^5的限制来自何处。

对不起,堆栈溢出不是一个为我做作业的网站。你试过什么?这是怎么失败的?@svick实际上这个问题缩小到了一个问题,即在无向图或树(而不是二叉树)中查找两个节点的最低共同祖先。在这方面需要帮助。抱歉,我在堆栈溢出中发布了我的问题。我是因为时间关系才这么做的……你能给我建议一些算法吗?@svick:你可以把这些东西交给职业训练局。你还需要这个问题的答案吗?您可以使用多种方法来解决最低共同祖先问题-DFS遍历顺序+范围最小查询,我认为2^K父级分解,重-轻分解。。etc,可通过ON或ON log N预计算回答Olog N中的所有查询