我需要一种可以有效解决下面问题的算法:
给定一个树(非二进制),最多有200000条边和3个节点x,y,z。编写一个算法,如果y位于x的路径中,则返回true,z或z位于x和y的路径中。查询数量大约为10 ^ 5.
答案 0 :(得分:-1)
似乎很简单。由于它是一棵树,要测试x -> y -> z
,请从z
开始,然后遍历到树的根。同样,要测试x -> z -> y
,请从y
开始,然后遍历到树的根。你当然可以同时从z
和y
开始,然后向上遍历树,直到你发现满足两个路径条件中的任何一个,或者你发现一个矛盾的信息,比如作为' z'并且' y'属于' x'的两个不同分支,或者即使你一直遍历到根目录也没有找到x
。
当你有一个完全线性的树,每个节点只有一个孩子,这样简单算法的最坏情况就会发生,这样x
就是根,y
是100000
个边缘远离x
(即中途),z
是叶子。我不确定限制10^5
的来源。