倍增,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);
 */
相关推荐
风筝在晴天搁浅36 分钟前
快手/字节 CodeTop LeetCode 415.字符串相加
算法·leetcode
hoiii1871 小时前
基于栅格法的机器人工作空间划分系统
数据结构·机器人
DragonnAi1 小时前
猫咪如厕检测与分类识别系统系列【十四】 项目结构重新整理-即将开源完整算法
算法·开源
机器视觉_Explorer1 小时前
【halcon】编程技巧:鼠标擦除
图像处理·人工智能·深度学习·算法·视觉检测
灵智实验室2 小时前
PX4状态估计技术EKF2详解(二):EKF2 误差状态动力学与协方差传播
算法·无人机·px 4
米粒12 小时前
力扣算法刷题 Day 64 Floyd算法 & A* 算法 & 总结篇
算法·leetcode·职场和发展
XX風3 小时前
OpenGL中Face culling 面剔除的具体实现
算法·图形渲染
IT猿手3 小时前
光伏模型参数估计:基于山羊优化算法(GOA )的光伏模型参数辨识问题求解研究,免费提供完整MATLAB代码链接
开发语言·算法·matlab·群智能优化算法·智能优化算法·光伏模型参数估计·光伏模型参数辨识
麻雀飞吧3 小时前
期货量化策略讲解:天勤量化下的跨期价差均值回归策略实战
python·算法·均值算法·回归
sali-tec4 小时前
C# 基于OpenCv的视觉工作流-章62-线线距离
图像处理·人工智能·opencv·算法·计算机视觉