检查2个树节点是否相关(即祖先-后代)
- 在 O(1) 时间内用 O(N) 空间解决它(N = 节点数)
- 允许预处理
而已。我将在下面介绍我的解决方案(方法)。如果您想先考虑自己,请停下来。
对于预处理,我决定进行预排序(首先递归地遍历根,然后是子节点)并为每个节点提供一个标签。
让我详细解释一下标签。每个标签将由逗号分隔的自然数组成,例如 "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) 空间。
预计会有任何有修复或替代方法的批评者。