📌  相关文章
📜  使用二值提升技术的N元树中节点的Kth祖先(1)

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

使用二值提升技术的N元树中节点的Kth祖先
介绍

在N元树中,每个节点可能会有多个子节点。当需要快速查找某个节点的Kth祖先时,可以使用二值提升技术(Binary Lifting Technique)。

二值提升技术是一种用于优化查找大树中某个节点的祖先节点的算法,其核心思想是将从一个节点到它的2的幂次祖先节点的路径预处理并存储在一个二维数组中。

此时,如果要查找某个节点p的Kth祖先,只需将K表示为二进制数,然后按位向上跳转即可。

解决方法

首先,我们需要用深度搜索来将树存储在一个邻接表中。

def dfs(v, p):
    for u in adj[v]:
        if u == p:
            continue
        depth[u] = depth[v] + 1
        parent[u][0] = v
        dfs(u, v)

接下来,我们使用动态规划的方法来填充parent数组。某个节点u的2i的祖先可以表示为u的2的i-1的祖先的2的(i-1)次方的祖先。

for j in range(1, LogN + 1):
    for i in range(1, N + 1):
        parent[i][j] = parent[parent[i][j - 1]][j - 1]

最后,我们可以使用以下代码来查找某个节点的Kth祖先。

def kthAncestor(u, k):
    if depth[u] < k: 
        return -1
    for i in range(LogN + 1):
        if k & (1 << i):
            u = parent[u][i]
    return u
Markdown 代码片段
## 使用二值提升技术的N元树中节点的Kth祖先

### 介绍

在N元树中,每个节点可能会有多个子节点。当需要快速查找某个节点的Kth祖先时,可以使用二值提升技术(Binary Lifting Technique)。

二值提升技术是一种用于优化查找大树中某个节点的祖先节点的算法,其核心思想是将从一个节点到它的2的幂次祖先节点的路径预处理并存储在一个二维数组中。

此时,如果要查找某个节点p的Kth祖先,只需将K表示为二进制数,然后按位向上跳转即可。

### 解决方法

首先,我们需要用深度搜索来将树存储在一个邻接表中。

```python
def dfs(v, p):
    for u in adj[v]:
        if u == p:
            continue
        depth[u] = depth[v] + 1
        parent[u][0] = v
        dfs(u, v)

接下来,我们使用动态规划的方法来填充parent数组。某个节点u的2i的祖先可以表示为u的2的i-1的祖先的2的(i-1)次方的祖先。

for j in range(1, LogN + 1):
    for i in range(1, N + 1):
        parent[i][j] = parent[parent[i][j - 1]][j - 1]

最后,我们可以使用以下代码来查找某个节点的Kth祖先。

def kthAncestor(u, k):
    if depth[u] < k: 
        return -1
    for i in range(LogN + 1):
        if k & (1 << i):
            u = parent[u][i]
    return u