小编典典

通过预处理检查O(1)中是否有2个树节点相关(祖先/后代)

algorithm

检查两个树节点是否相关(即祖先后代)

  • 在O(N)个空间(N =节点数)下,在O(1)时间内求解
  • 允许预处理

而已。 我将在下面转到我的解决方案(方法)。如果您想先考虑自己,请停下来。


对于预处理,我决定进行预订(先递归遍历根节点,然后遍历子节点),并为每个节点指定标签。

让我详细解释标签。每个标签将由逗号分隔的自然数组成,例如“ 1,2,1,4,5”-该序列的长度等于 (节点的深度+ 1) 。例如,根节点的标签为“
1”,根节点的子节点将具有标签“ 1,1”,“ 1,2”,“ 1,3”等。下一级节点的标签将为“ 1,1,1” “,” 1,1,2“,…,”
1,2,1“,” 1,2,2“,…

假定节点的“ 订单号 ”是其父 节点 的子列表中的“ 该节点的基于1的索引 ”。

通用规则:节点的标签由其父标签,逗号和节点的“ 订单号 ”组成。

因此,为了回答O(1)中两个节点是否相关(即祖先后代),我将检查其中一个的标签是否为另一个节点的“ 前缀
”。虽然我不确定是否可以考虑将此类标签占用O(N)空间。

任何具有修复程序或替代方法的批评家都是可以预期的。


阅读 370

收藏
2020-07-28

共1个答案

小编典典

如果您存储每个顶点的前序号和后序号,并使用以下事实,则可以在O(n)预处理时间和O(n)空间中进行查询,并使用O(1)查询时间。

对于树T的两个给定节点x和y,当且仅当x在T的预遍历中出现在y之前且在后序遍历中出现在y之后时,x才是y的祖先。

(从此页面:http :
//www.cs.arizona.edu/xiss/numbering.htm

在最坏的情况下,您所做的是Theta(d),其中d是较高节点的深度,所以不是O(1)。空间也不是O(n)。

2020-07-28