【发布时间】:2018-07-26 11:19:20
【问题描述】:
问题
给定一个有 n 个节点的有根树,其中所有叶子都从一组标签中标记出来。构建一个数据结构,给定叶节点 a 和标签 l,可以找到 a 的最低祖先 u ,其中 u 至少有一个标签为 l 的后代。
线性空间/线性时间方法
- 从叶 a 开始
- 检查 a 的所有兄弟姐妹
- 如果兄弟姐妹有标签 l,则查找 a 和该兄弟姐妹之间的最低共同祖先。
- 否则继续父母
- 如果所有从父母传下来的叶节点都没有标记为 l,则继续到祖父母并检查他们的叶节点后代。
- 继续递归检查大祖父母及其所有后代叶节点,直到找到标记为 l 的后代。
这具有时间复杂度 O(n) 和空间复杂度 O(n)。
有没有更快的方法来处理线性空间复杂度?也许通过某种方式对树进行预处理? l 和 a 不是固定的,因此预处理必须灵活。
可以通过 Eulerian-Tour 使用 RMQ 在恒定时间内找到最低的共同祖先。
请记住,树不是以任何方式平衡或排序的。
【问题讨论】:
-
如果
a和l是兄弟姐妹,那么根据定义它们共享同一个父节点,即最低的共同祖先。a的“兄弟姐妹”在这里是什么意思?另外,你的节点有父指针吗? -
@JimMischel 是的,如果 a 和标签为 l 的某个节点是兄弟节点,那么是的,父节点将是最低的共同祖先。我只是使用“较低的共同祖先”,以便它适用于任何两个叶节点。
-
如果您愿意在预处理上花费时间和内存,您可以创建一个查找表,为您提供 O(1) 查询。内存需求为 O(m^2),其中 m 是叶节点的数量。
-
是的,但是该算法适用于没有额外数据结构的任意树。所以预处理会考虑时间复杂度。不过谢谢!
-
如果你想对一棵树进行一次查询,那么最坏情况的时间复杂度是 O(n),因为你可能必须查看每个节点。最坏情况下的空间复杂度为 O(n),因为在退化树中,您可能必须维护包含树中每个节点的路径。鉴于您概述的限制,我认为您无法提高复杂性。
标签: algorithm data-structures tree ancestor lowest-common-ancestor