首页 > 其他分享 >[1483. 树节点的第 K 个祖先] 【路径】

[1483. 树节点的第 K 个祖先] 【路径】

时间:2024-04-06 18:56:26浏览次数:29  
标签:val int 路径 children 1483 pathIdMap pathId new 节点

思路很简单:


import java.util.ArrayList;
import java.util.List;

class TreeAncestor {
    List<Integer>[] children;
    List<List<Integer>> paths = new ArrayList<>();
    int[][] pathIdMap;

    public static void main(String[] args) {
        TreeAncestor ancestor = new TreeAncestor(5, new int[]{
                -1, 0, 0, 0, 3
        });
        int ans = ancestor.getKthAncestor(3, 2);
        System.out.println(ans);
    }

    public TreeAncestor(int n, int[] parent) {
        children = new ArrayList[n];
        for (int i = 0; i < n; i++) {
            children[i] = new ArrayList<>();
        }
        for (int i = 0; i < n; i++) {
            if (i == 0) {
                continue;
            }
            children[parent[i]].add(i);
        }

        int pathId = 0;
        pathIdMap = new int[n + 1][2];
        for (int i = 0; i < n; i++) {
            if (!children[i].isEmpty()) {
                continue;
            }
            List<Integer> path = new ArrayList<>();
            int val = i;
            int num = 0;
            while (val != -1) {
                path.add(val);
                pathIdMap[val][0] = pathId;
                pathIdMap[val][1] = num++;
                val = parent[val];
            }
            paths.add(path);
            pathId++;
        }
    }

    public int getKthAncestor(int node, int k) {
        int[] pathId = pathIdMap[node];
        List<Integer> path = paths.get(pathId[0]);
        int size = path.size();
        int offset = pathId[1];
        if (size <= offset + k) {
            return -1;
        }
        return path.get(offset + k);
    }
}

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

标签:val,int,路径,children,1483,pathIdMap,pathId,new,节点
From: https://www.cnblogs.com/fishcanfly/p/18117748

相关文章

  • 【MATLAB源码-第171期】基于matlab的布谷鸟优化算法(COA)无人机三维路径规划,输出做短路
    操作环境:MATLAB2022a1、算法描述布谷鸟优化算法(CuckooOptimizationAlgorithm,COA)是一种启发式搜索算法,其设计灵感源自于布谷鸟的独特生活习性,尤其是它们的寄生繁殖行为。该算法通过模拟布谷鸟在自然界中的行为特点,为解决各种复杂的优化问题提供了一种新颖的方法。从算法......
  • 17天【代码随想录算法训练营34期】第六章 二叉树part04(● 110.平衡二叉树 ● 257.
    110.平衡二叉树#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution:defgetDepth(self,root):......
  • P4551 最长异或路径 题解
    题目链接:最长异或路径看到树上路径问题,且是异或和这种,先思考树上前缀和转化为前缀和问题。如果我们预处理出\(pre[curr]\)表示\(curr\)这个点到根的前缀异或值,那么很显然我们路径的两个点\(u\)与\(v\)的\(pre[u]\opluspre[v]\)和传统的加法的树上前缀和并不一样,因为异......
  • P7771 【模板】欧拉路径
    原题链接题解链式前向星版本的欧拉回路dfsvoiddfs(intu){for(inti=head[u];i>0;i=head[u]){head[u]=Next[i];//走过的路直接跳过dfs(to[i]);}que[l++]=u;}接下来的难点是如何字典序搜索。我们在dfs的时候直接让走字典序最小的边即......
  • 16天【代码随想录算法训练营34期】第六章 二叉树part03(● 104.二叉树的最大深度 559
    104.二叉树的最大深度#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution:defmaxDepth(self,root:O......
  • 每日一题:1483. 树节点的第 K 个祖先
    给你一棵树,树上有 n 个节点,按从 0 到 n-1 编号。树以父节点数组的形式给出,其中 parent[i] 是节点 i 的父节点。树的根节点是编号为 0 的节点。树节点的第 k 个祖先节点是从该节点到根节点路径上的第 k 个节点。实现 TreeAncestor 类:TreeAncestor(intn,int[]......
  • 代码随想录算法训练营DAY18|C++二叉树Part.5|513.找树左下角的值、112. 路径总和、113
    文章目录513.找树左下角的值层序-迭代遍历前中后序-递归遍历思路伪代码CPP代码112.路径总和、113.路径总和II112.路径总和思路伪代码实现CPP代码113.路径总和II思路伪代码实现CPP代码实现106\105.从中(前)序与后(中)序遍历序列构造二叉树106.从中序与后序遍历序列......
  • 代码随想录 | 图论 797. 所有可能的路径(dfs) ,200. 岛屿数量 (dfs)200. 岛屿数量 (bfs)
    797.所有可能的路径https://leetcode.cn/problems/all-paths-from-source-to-target/description/List<List<Integer>>res;List<Integer>path;publicList<List<Integer>>allPathsSourceTarget(int[][]graph){res=newA......
  • 蓝桥杯_省_21B_E_路径(c++)
    题目描述小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图中的最短路径。小蓝的图由2021个结点组成,依次编号1至2021。对于两个不同的结点a,b,如果a和b的差的绝对值大于21,则两个结点之间没有边相连;如果a和b的差的绝对值小于等于21,则两个点之间......
  • matlab练习程序(Pure Pursuit路径跟踪)
    当时写stanley就实现了,贴上来记录一下。方法示意图:控制率公式:其中L为轴距,e为横向误差,v为车辆速度,lambda和c为控制参数。算法步骤如下:1.根据当前定位结果找到路径最邻近点。2.计算该点与定位结果横向误差e。3.根据控制率公式计算出前轮转角。4.将前轮转角转化为航向......