LC-1483. 树节点的第 K 个祖先(树上倍增算法)

news2024/9/27 12:14:53

1483. 树节点的第 K 个祖先

难度困难134

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

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

实现 TreeAncestor 类:

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

示例 1:

img

输入:
["TreeAncestor","getKthAncestor","getKthAncestor","getKthAncestor"]
[[7,[-1,0,0,1,1,2,2]],[3,1],[5,2],[6,3]]

输出:
[null,1,0,-1]

解释:
TreeAncestor treeAncestor = new TreeAncestor(7, [-1, 0, 0, 1, 1, 2, 2]);

treeAncestor.getKthAncestor(3, 1);  // 返回 1 ,它是 3 的父节点
treeAncestor.getKthAncestor(5, 2);  // 返回 0 ,它是 5 的祖父节点
treeAncestor.getKthAncestor(6, 3);  // 返回 -1 因为不存在满足要求的祖先节点

提示:

  • 1 <= k <= n <= 5 * 104
  • parent[0] == -1 表示编号为 0 的节点是根节点。
  • 对于所有的 0 < i < n0 <= parent[i] < n 总成立
  • 0 <= node < n
  • 至多查询 5 * 104

树上倍增算法

https://leetcode.cn/problems/kth-ancestor-of-a-tree-node/solution/mo-ban-jiang-jie-shu-shang-bei-zeng-suan-v3rw/

预处理出每个节点的第 2^i个祖先节点,即第 2,4,8.... 个祖先节点(注意 x 的第1 个祖先节点就是 parent[x]由于任意 k 可以分解为若干不同的 2 的幂(例如 13 = 8+4+1),所以只需要预处理出这些 2^i 祖先节点,就可以快速地到达任意第 k 个祖先节点

例如 k = 13 = 8+4+1 = 1101_(2),可以先往上跳 8 步,再往上跳 4步和1步;也可以先往上跳1步,再往上跳 4 步和 8 步。无论如何跳,都只需要跳 3 次就能到达第 13 个祖先节点据此,可以得到下面的算法。

算法:

在构造函数 TreeAncestor 中,预处理出每个节点 x 的第 2^i 个祖先节点,记作 pa[x][i] (若第 2^i 个祖先节点不存在则 pa[x][i] = -1) 。计算方式如下

先枚举 i,再枚举 x。相当于先算出所有爷爷节点,再算出所有爷爷的爷爷节点,依此类推.

pa[x][0]=parent[x],即父节点。

pa[x][1]=pa[pa[x][0]][0],即爷爷节点。

一般地,pa[x][i+1]=pa[pa[x][i]][i]。如果 pa[x][i] = -1pa[x][1+1] = -1

这里 i+1至多为 logn 。例如 n = 13 时,log13 = 3,至多需要预处理到第 2^3 个祖先节点。 (当然,你也可以先把树高,或者每个节点的深度求出来,再据此做精细地计算。)

class TreeAncestor {

    private int[][] pa;

    public TreeAncestor(int n, int[] parent) {
        int m = 32 - Integer.numberOfLeadingZeros(n); // n 的二进制长度
        // 预处理出每个节点 x 的第 2^i 个祖先节点,记作 pa[x][i] 
        pa = new int[n][m];
        for(int i = 0; i < n; i++){
            pa[i][0] = parent[i];
        }
        // 先枚举 `i`,再枚举 `x`。相当于先算出所有爷爷节点,再算出所有爷爷的爷爷节点,依此类推
        for(int i = 0; i < m-1; i++){
            for(int x = 0; x < n; x++){
                int p = pa[x][i];
                pa[x][i+1] = p < 0 ? -1 : pa[p][i];
            }
        }
    }
    
    public int getKthAncestor(int node, int k) {
        int m = 32 - Integer.numberOfLeadingZeros(k); // k 的二进制长度
        for(int i = 0; i < m; i++){
            if(((k >> i) & 1) > 0){ // k 的二进制从低到高第 i 位是 1
                node = pa[node][i];
                if(node < 0) break; // 如果node=-1, 说明第k个祖先节点不存在
            }
        }
        return node;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/637747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开发板安卓主板定制开发-基于MT6765的考核管理终端方案

Mediatek Genio系列平台以其安全、可扩展、强大且优质的解决方案&#xff0c;受到全球设备制造商的信任。这个系列的平台已经被广泛应用&#xff0c;为不同的应用提供了高效、安全、稳定的解决方案。 在Mediatek Genio系列平台中&#xff0c;Mediatek Helio P35 (MT6765)是一款…

企业提升客户体验,得先搭建在线帮助文档

在企业竞争日益激烈的市场中&#xff0c;客户体验成为企业获得成功的关键因素之一。企业需要不断提升客户体验&#xff0c;以增加客户的忠诚度和满意度。而搭建在线帮助文档是提升客户体验的一个重要手段。本文将介绍为什么企业需要搭建在线帮助文档&#xff0c;并提供一些实用…

【Java SE】一文详解next和nextLine的区别

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 引入 总结:next()和 nextLine()方法的区别 类…

DVWA-5.File upload

前提 1、在实验时&#xff0c;需要在 DVWA Security模块&#xff0c;设置需要实验的级别&#xff0c;对于不同的级别&#xff0c;php会调用不同的代码去执行用户操作。对于low level&#xff0c;系统的安全性低&#xff0c;容易受到攻击。impossible级别&#xff0c;系统的安全…

STM32——06-STM32电动车报警器

项目需求 点击遥控器 A 按键&#xff0c;系统进入警戒模式&#xff0c;一旦检测到震动&#xff08;小偷偷车&#xff09;&#xff0c;则喇叭发出声响报警&#xff0c; 吓退小偷。 点击遥控器 B 按键&#xff0c;系统退出警戒模式&#xff0c;再怎么摇晃系统都不会报警&#xff…

SD va01/02 保存时,产生销售订单号后的增强

业务对接外围系统&#xff0c;在SAP下销售订单&#xff0c;要求实时传递到外围系统。要求先要有销售订单编号 策略 在销售订单保存后找一处增强&#xff0c;并做一个日志。 日志如下&#xff1a; 对象类型&#xff0c;凭证编号序列&#xff0c;外围系统编号&#xff0c;状态…

如何快速完成TensorRT模型生成和加速

0. 简介 之前作者在《深度学习之从Python到C》介绍了一些比较传统的方法&#xff0c;主要侧重介绍了如何将pth和pytorch传统形式文件转化为onnx的文件&#xff0c;这个部分的内容&#xff0c;也可以主要看一下《PyTorch模型部署&#xff1a;pth转onnx跨框架部署详解代码》这个…

江山变压器:以数据驱动决策,CRM铸就智能制造之「变」

浙江江山变压器股份有限公司(以下简称“江变”)&#xff0c;创始于1969年&#xff0c;全国变压器行业协会理事单位、全国输配电“十三五”规划的5家起草单位之一&#xff0c;被列入国家千家名牌培育工程。 公司主要客户为国家电网、南方电网、五大发电集团&#xff0c;产品远销…

微信小程序设置 本地图片为背景图

微信小程序 通过wxss进行设置 背景图报错 经查询&#xff0c;发现微信小程序中&#xff0c;将网络图片或base64图片设置为背景图片可正常显示&#xff0c;将本地图片设置为背景图片则不能显示&#xff0c;解决方法有三种&#xff0c;个人采用的是第三种方法。 1. 本地图片转换…

私有云和公有云是什么?有什么区别?

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、私有云和公有云是什么&#xff1f; 1、私有云是什么&#xff1f; 2、公有云是什么&#xff1f; 二、举个例子 1、私有云 2、公…

内网渗透—Linux上线

内网渗透—Linux上线 1. 前言2. 下载插件3. CS配置3.1. 客户端配置3.1.1. 导入插件文件3.1.2. 配置监听 3.2. 服务端配置3.2.1. 导入配置文件 3.3. 生成木马3.3.1. 修改cna文件3.3.2. 修改后效果 3.4. 执行木马 1. 前言 默认情况下CS是不支持上线Linux的&#xff0c;只支持上线…

媒介易教你海外品牌推广:如何选择适合的新闻通稿发布平台?

在进行海外品牌推广时&#xff0c;选择合适的海外新闻通稿发布第三方平台是提高品牌曝光度和影响力的重要一环。这些平台可以帮助企业将新闻内容传播到全球范围内的媒体和受众&#xff0c;为品牌推广提供更广阔的机会。然而&#xff0c;选择合适的发布平台并不容易&#xff0c;…

乐盒开源盲盒uniapp源码系统

源码我也没测试过小白就不要尝试了 下载下来&#xff0c;之后&#xff0c;通过 node 安装如下依赖&#xff0c;即可查看效果&#xff1a; npm install uni-simple-router # 或者&#xff1a;yarn add uni-simple-router npm install uni-simple-router npm install uni-read…

图解数据结构--栈的实现-C语言版本--源码

目录-总 -分- 总结构 图片可视化 总源码1.头文件介绍---分2.节点的实现3.栈顶栈底4.函数的提前声明5. 栈 ---初始化栈6. 栈 ---进栈7.栈 --- 遍历8.栈 --- 是否为空9.栈 --- 出栈10总结 图片可视化 总 源码 /*time 2023年6月12日12:39:06auther yzmcntent stract 栈 */#inclu…

行业报告 | 企业AIGC商业落地应用研究报告

原创 | 文 BFT机器人 01 AIGC&#xff08;生成式人工智能&#xff09;定义 02 洞观&#xff1a;AIGC市场全貌与供应商的摩拳擦掌 生成式人工智能技术的落地已经远远超出了商业化的进程 在企业现有数字化作业体系中切入&#xff0c;成为AIGC率先落地的存量场景 和SaaS同根的生成…

破坏双亲委派机制(自定义类加载器)

jvm中讲过&#xff0c;一个类的创建是要经历类加载器的&#xff0c;那么我们来讲讲如何自定义类加载器。 jvm优先级最高的就是自定义类加载器&#xff0c;为什么这么说呢&#xff1f;我们来看看类加载器的源码&#xff1a; 首先我们解释一下这个方法做了什么&#xff0c;要求返…

网络套接字编程

之前我们粗浅的认识了一下网络的一些知识&#xff0c;比如OSI七层模型&#xff0c;TCP/IP四层模型&#xff0c;那么我们具体怎么实现两台主机的交互呢&#xff1f; 在学习这些之前&#xff0c;我们需要准备一些预备知识。 目录 预备知识 1:认识源IP地址和目的IP地址 2&…

matlab字符串的操作方法

一个字符串是存储在一个行向量中的文本&#xff0c;这个行向量中的每一个元素代表一个字符&#xff0c;字符串可以由0个或多个字符组成。下面是一些字符串的操作方法 &#xff08;1&#xff09;字符串的创建 MATLAB中创建字符串非常简单&#xff0c;将字符串中的字符放到一对…

Jmeter接口之间的动态关联(同一线程组和跨线程组)

目录 前言&#xff1a; 动态关联提取cookie 1.同一线程组里的请求之间进行动态关联 2.跨线程组之间的动态关联 前言&#xff1a; 在进行接口测试时&#xff0c;有时候需要将一个接口的返回值作为参数传递给另一个接口&#xff0c;这就需要用到动态关联。JMeter提供了丰富的…

Haproxy负载均衡集群(时间能回答少年的所有不解)

文章目录 一、Haproxy的基础了解1.常用的负载均衡调度器2.Haproxy 应用相比较其他的优缺点3.Haproxy的特性4.LVS、Nginx、HAproxy的区别 二、Haproy负载均衡部署1.实验前准备2.实验的具体操作步骤步骤一&#xff1a;部署haproxy负载均衡调度器步骤二&#xff1a;Nginx节点服务器…