倍增,LeetCode 1483. 树节点的第 K 个祖先

目录

一、题目

1、题目描述

2、接口描述

python3

cpp

3、原题链接

二、解题报告

1、思路分析

2、复杂度

3、代码详解

python3

cpp


一、题目

1、题目描述

给你一棵树,树上有 n 个节点,按从 0n-1 编号。树以父节点数组的形式给出,其中 parent[i] 是节点 i 的父节点。树的根节点是编号为 0 的节点。

树节点的第 k 个祖先节点是从该节点到根节点路径上的第 k 个节点。

实现 TreeAncestor 类:

  • TreeAncestor(int n, int[] parent) 对树和父数组中的节点数初始化对象。
  • getKthAncestor``(int node, int k) 返回节点 node 的第 k 个祖先节点。如果不存在这样的祖先节点,返回 -1

2、接口描述

python3
复制代码
python 复制代码
class TreeAncestor:

    def __init__(self, n: int, parent: List[int]):


    def getKthAncestor(self, node: int, k: int) -> int:



# Your TreeAncestor object will be instantiated and called as such:
# obj = TreeAncestor(n, parent)
# param_1 = obj.getKthAncestor(node,k)
cpp
复制代码
cpp 复制代码
class TreeAncestor {

  TreeAncestor(int n, List<int> parent) {
    
  }
  
  int getKthAncestor(int node, int k) {
    
  }
}

/**
 * Your TreeAncestor object will be instantiated and called as such:
 * TreeAncestor obj = TreeAncestor(n, parent);
 * int param1 = obj.getKthAncestor(node,k);
 */

3、原题链接

1483. 树节点的第 K 个祖先


二、解题报告

1、思路分析

关于ST表求LCA见:LCA算法-倍增算法-CSDN博客

比ST表求LCA板子题还要简单的题

我们预处理出f[u][i],代表u向上跳2^i层的祖先

然后对于查询向上第k个祖先我们只需要将k二进制拆分往上跳即可

2、复杂度

时间复杂度: 预处理O(nlogn) 查询:O(k)空间复杂度:O(nlogn)

3、代码详解

python3
复制代码
python 复制代码
class TreeAncestor:

    def __init__(self, n: int, parent: List[int]):
        H = n.bit_length()
        fa = [[0] * H] + [[p + 1] + [0] * (H - 1) for p in parent]
        for i in range(1, H):
            for j in range(1, n + 1):
                fa[j][i] = fa[fa[j][i - 1]][i - 1]
        self.fa = fa

    def getKthAncestor(self, x: int, k: int) -> int:
        x += 1
        fa = self.fa
        for i in range(k.bit_length()):
            if k >> i & 1:
                x = fa[x][i]
        return x - 1


# Your TreeAncestor object will be instantiated and called as such:
# obj = TreeAncestor(n, parent)
# param_1 = obj.getKthAncestor(node,k)
cpp
复制代码
cpp 复制代码
const int N = 5e4 + 10, H = 16;
int fa[N][H];
class TreeAncestor {
public:
    TreeAncestor(int n, vector<int>& parent) {
        for(int i = 1; i < n; i++)
            fa[i + 1][0] = parent[i] + 1;
        for(int i = 1, ed = 32 - __builtin_clz(n); i < ed; i++)
            for(int j = 1; j <= n; j++)
                fa[j][i] = fa[fa[j][i - 1]][i - 1];
    }
    
    int getKthAncestor(int x, int k) {
        ++x;
        for(int i = 32 - __builtin_clz(k); i >= 0; i--)
            if(k >> i & 1)
                x = fa[x][i];
        return x - 1;
    }
};

/**
 * Your TreeAncestor object will be instantiated and called as such:
 * TreeAncestor* obj = new TreeAncestor(n, parent);
 * int param_1 = obj->getKthAncestor(node,k);
 */
相关推荐
Sarvartha25 分钟前
C++ STL 栈的便捷使用
c++·算法
夏鹏今天学习了吗1 小时前
【LeetCode热题100(92/100)】多数元素
算法·leetcode·职场和发展
飞Link1 小时前
深度解析 MSER 最大稳定极值区域算法
人工智能·opencv·算法·计算机视觉
bubiyoushang8881 小时前
基于CLEAN算法的杂波抑制Matlab仿真实现
数据结构·算法·matlab
曾经的三心草2 小时前
redis-2-数据结构内部编码-单线程-String命令
数据结构·数据库·redis
2401_894828122 小时前
从原理到实战:随机森林算法全解析(附 Python 完整代码)
开发语言·python·算法·随机森林
Remember_9933 小时前
【LeetCode精选算法】前缀和专题二
算法·哈希算法·散列表
源代码•宸3 小时前
Leetcode—509. 斐波那契数【简单】
经验分享·算法·leetcode·面试·golang·记忆化搜索·动规
博大世界3 小时前
matlab结构体数组定义
数据结构·算法
Loo国昌4 小时前
【LangChain1.0】第九阶段:文档处理工程 (LlamaIndex)
人工智能·后端·python·算法·langchain