【发布时间】:2014-08-12 00:19:13
【问题描述】:
给出了树。边信息以邻接表格式给出。
节点编号在 1, 2, 3, ....N.
树的根总是 1。
现在,给出了两个索引。问题是上述两个中的任何一个索引是否位于从根(1)到其他索引的路径上。
约束
- 节点数为 10^5。
- 可以触发的最大查询数,10^5。
- 父 ID 始终小于子 ID。
示例:-
给定的边缘:-
1 2
2 5
1 3
3 7
1 4
4 8
8 9
问题 -
2 3 ( Answer - Not possible, from 1 to 2, 3 never comes in between and from 1 to 3, 2 never comes in between.)
8 9 ( Answer - Possible, 8 lies in between 1 and 9)
下一个例子:-
1 2
2 4
2 5
1 3
3 6
3 7
3 8
【问题讨论】:
-
你是否有一个特殊的边到父节点的关系,比如
node.parent,或者是父节点的ID总是小于子节点的ID,还是边总是在形成(parent, child)?在这些情况下,您可以直接“向上”,直到找到根节点或其他节点。 -
没有提到这种关系。但是,如果我按照您所说的那样进行迭代,那么在最坏的情况下,每个查询都需要 O(节点总数)。
-
在最坏的情况下,树是一个链。在一般情况下,它应该是 O(logn)。
-
你有没有其他方法,通过存储一些东西来减少查询响应时间?
-
好吧,你当然可以总是缓存一些东西,比如创建一个 hashmap(nodeid -> 父节点集),然后查找是 O(1),但这需要大约 O(nlogn) 空间,除非我弄错了。
标签: algorithm