📜  父数组表示中的最低共同祖先(1)

📅  最后修改于: 2023-12-03 14:56:12.573000             🧑  作者: Mango

父数组表示中的最低共同祖先

在树形结构中,最低共同祖先(LCA)指的是两个节点在树中的最近公共祖先节点,而父数组(Parent Array)则是一种特殊的树形数据结构,它是一个数组,其中每个元素表示节点对应的父节点。

在父数组表示中,最低共同祖先可以使用倍增算法进行求解,该算法首先通过预处理获取每个节点的第2^i个祖先节点(i为2的幂),然后在查找两个节点的最低共同祖先时,从深度大的节点开始,逐渐向上跳2的幂次方步长,直到找到它们的最低共同祖先为止。

具体实现可以结合代码来理解。

代码实现

以下是使用Python语言实现父数组表示中的最低共同祖先的代码片段:

class LCA:
    def __init__(self, n: int, parent: List[int]):
        self.n = n
        self.max_depth = int(math.log2(n)) + 1
        self.ancestor = [[-1] * n for _ in range(self.max_depth)]
        self.depths = [-1] * n

        # 预处理
        for i in range(n):
            self.ancestor[0][i] = parent[i]

        for k in range(1, self.max_depth):
            for i in range(n):
                ancestor = self.ancestor[k - 1][i]
                if ancestor != -1:
                    self.ancestor[k][i] = self.ancestor[k - 1][ancestor]

    def get_lca(self, u: int, v: int) -> int:
        if self.depths[u] < self.depths[v]:
            u, v = v, u

        # 跳到同一深度
        for k in range(self.max_depth - 1, -1, -1):
            if self.depths[u] >= (1 << k) and self.depths[self.ancestor[k][u]] >= self.depths[v]:
                u = self.ancestor[k][u]

        if u == v:
            return u

        # 一起向上跳
        for k in range(self.max_depth - 1, -1, -1):
            if self.ancestor[k][u] != self.ancestor[k][v]:
                u = self.ancestor[k][u]
                v = self.ancestor[k][v]

        return self.ancestor[0][u]
使用案例

当父数组为[2, 2, 3, 3, 3, 3, 4, 4, 5, 5],表示如下一棵树:

   0
   |
   2
  / \
 1   3
    / \
   4   5
  / \
 6   7
  |
 8
  |
 9

我们可以通过以下代码实现查找节点6和9的最低共同祖先:

n = 10
parent = [2, 2, 3, 3, 3, 3, 4, 4, 5, 5]
lca = LCA(n, parent)
print(lca.get_lca(6, 9))  # 输出 2

以上输出结果符合我们在树结构中手动计算的最低共同祖先为节点2。