检查两个树节点是否相关(即祖先后代)
而已。 我将在下面转到我的解决方案(方法)。如果您想先考虑自己,请停下来。
对于预处理,我决定进行预订(先递归遍历根节点,然后遍历子节点),并为每个节点指定标签。
让我详细解释标签。每个标签将由逗号分隔的自然数组成,例如“ 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)空间。
任何具有修复程序或替代方法的批评家都是可以预期的。
如果您存储每个顶点的前序号和后序号,并使用以下事实,则可以在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)。