LCA 类问题

LCA与RMQ问题详解 LCA问题与RMQ问题详解 1.问题描述    LCA:Least Common Ancestors(最近公共祖先)。对于一棵树 T 中的任意两个节点u,v,算法 x=LCA(T, u, v) 返回的结果为节点u,v的最近公共父节点,也即是离树T的根节点最远的节点x,使得x同时是u和v的祖先。       例子:对于T=(V,E) V={1,2,3,4,5,6,7,8,9,10,11,12, 阅读详情

LCA 类问题


  • LCA 类问题是二叉树的高频问题之一;
  • 有只给 root 的;
  • 还有不给 root 给 parent pointer 的。
  • 想面 FB,最好把各种二叉树问题的 recursion / iteration 还有 root / parent pointer 的写法都练熟才行,只 AC 是不够的。

下面这种向哪里走的问题,直接用尾递归解决。不要想遍历。

public class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        // Got to check if p and q is null as well;
        if(root == null) return root;

        if(root.val > p.val && root.val > q.val) 
            return lowestCommonAncestor(root.left, p, q);
        if(root.val < p.val && root.val < q.val) 
            return lowestCommonAncestor(root.right, p, q);

        return root;
    }
}
因为是尾递归,显而易见的改法是用 while循环省去递归占用的系统栈空间;
public class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        // Got to check if p and q is null as well;
        while(root != null){
            if(root.val > p.val && root.val > q.val) root = root.left;
            else if(root.val < p.val && root.val < q.val) root = root.right;
            else return root;
        }
        return root;
    }
}

Lowest Common Ancestor of a Binary Tree

时间复杂度 O(n),相对于每个 node 来讲,只会被函数调用和计算一次。
另一种时间复杂度的分析方式是,这题的递归结构是个 post-order traversal,遍历的复杂度当然是 O(n).
拿到树的题目,先想递归结构是什么,再想end condition.
想到这,迭代的写法也比较明显了,写个 post-order traversal 就行。
public class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null || root == q || root == p) return root;

        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);

        if(left != null && right != null) return root;
        else return (left == null) ? right : left;
    }
}
想到这,另外一种思路就是使用HashMap + Set

从“要啥”到“咋测”:手把手拆解Aspice SWE.1需求分析,为你的车载/嵌入式项目避坑 本文深入解析Aspice SWE.1需求分析在车载/嵌入式项目中的关键作用,帮助开发者将模糊的系统需求转化为可执行、可验证的软件需求。通过实战案例和结构化方法,详细拆解功能需求原子化、非功能需求工程化表达等核心技巧,为项目避坑提供实用指南。 阅读详情

相关推荐

MAX96724解串器拨码配置实战:从COAX/GMSL2模式到IIC地址设定

本文详细解析了MAX96724解串器的拨码配置方法,涵盖电源管理模式、I2C地址设定及COAX/GMSL2视频传输模式。通过实战案例和故障排查技巧,帮助工程师快速掌握xcDeserializer4.0版本的配置要点,避免常见错误,提升车载摄像头和工业视觉系统的调试效率。

weixin_29243279的博客 579

LCA问题(DFS+ST)

LCA问题: LCA问题是指在一棵二叉树中,求出两个结点的最近公共祖先。 例如在下面这个简单的二叉树中: F和E的LCA是B; D和C的LCA是A; D和E的LCA是B; A和B的LCA是A; 这里介绍一种用ST表算法来解决此类问题的算法,不了解ST算法的可以先移步:ST算法 ...

Q_M_X_D_D_的博客 3384

库存预测新思路:AI架构师的图神经网络应用

用图神经网络(GNN)解决传统库存预测的“关联盲区”,让预测从“孤立商品”转向“商品网络”。传统库存预测的痛点分析;GNN的核心概念(图结构、消息传递);GNN在库存预测中的算法原理与代码实战;实际应用场景与未来趋势。背景:用超市老板的烦恼引出传统方法的问题;核心概念:用“商品朋友圈”比喻GNN的图结构和消息传递;算法原理:用数学公式和Mermaid流程图讲清楚GNN的工作流程;实战:用PyTorch Geometric写一个简单的库存预测模型;

AI Python 编程之道的博客 959

LCA详解

LCA问题(least Comment Ancestors,最近公共祖先问题),是指给定一棵有根树T,给出若干个查询LCA(u,v)(通常查询数量较大), 每次求树T中两个顶点u和v的最近公共祖先,即找到一个节点,同时是u和v的祖先,并且深度尽可能的大(尽可能远离树根). LCA问题的解法有很多,有一般解法,基于tarjan的解法,跳表解法以及RMQ和LCA互相转化的解法。下面我们依次

刘伟的博客 2万+

linux入侵排查-综合日志分析

2.分析攻击者首次成功登录web管理后台的时间 还可以知道攻击者可能是通过10.2.4.11这个跳板服务器跳过来的,然后我们继续排查,可以发现日志中POST请求大多都是1047字节,然后往后大多是300字节,POST请求的响应状态码有200和302这两个,其中的302是爆破成功后持续爆破产生的日志,再1047字节和300字节中间夹着一个978字节,就是200响应和302响应的中间。7.分析攻击者留下的持久化后门的时间和后门执行情况 排查计划任务,发现有一个计划任务还是被加密的,应该是反弹shell的。

chinese_cabbage0的博客 644

点云中的Minkowski卷积

一、MinkowskiEngine简介 第一次见到MinkowskiEngine,应该是在两个月之前了,当时也没有去留意这个库。最近读了一些点云的论文,发现还是有不少论文的源码是基于MinkowskiEngine的,包括PointContrast(ECCV 2020),DGR(Deep Global Registration, CVPR 2020),Learning Multiview 3D Point Cloud Registration(CVPR 2020)和FCGF(Fully Convolution

zhulf0804的博客 7907

最近公共祖先(LCA)

最近公共祖先(LCA) 1. 最近公共祖先原理 原理 LCA问题:在一棵有根树中,一个节点的祖先节点是指它本身或者它父节点的祖先。给定两个节点,两个点共同的祖先中距离两者最近的节点就是这两个节点的最近公共祖先。需要注意的是最近公共祖先可能是这两个节点中的某一个。 LCA问题的解法有很多种,下面介绍四种,其中第二种、第三种最常用 1. 向上标记法 做法:求两个节点p、q的最近公共祖先原理,可以任选一个点,比如点p,沿着点p向上走,将走过的节点标记为true,代表已经走过,走到根节点后停止;然后让q

weixin_42638946的博客 8025

GOM Correlate拉伸试验后处理操作

本文描述了使用GOM Software 2022对拉伸试样进行后处理的操作,包括设置检测点、引伸计、输出应变数据到表格、输出报告为视频等

qq_45008924的博客 4665

LCA最近公共祖先问题详解

图论和树结构中最近公共祖先(Least Common Ancestor,LCA)是一个经典的问题,本文我将详细介绍LCA问题的常见求解算法、优化策略,并结合Java代码示例,带你全面掌握这一重要算法问题的求解方法

1493

别让IO口保护二极管坑了你!实测讲解单片机电流倒灌的三种典型症状与防护

本文深入解析单片机电流倒灌的三大典型症状与防护方案,重点分析STM32等单片机在ADC采样异常、系统假死和通信速率异常中的表现。通过实测数据和电路设计建议,提供从基础二极管隔离到专业隔离器件的分级防护策略,帮助工程师有效预防和解决电流倒灌问题。

weixin_29280219的博客 348

Selenium ChromeDriver反爬与性能优化实战指南

ChromeDriver作为Selenium的核心驱动,本质是浏览器自动化执行引擎,其默认行为会暴露大量JS运行时指纹(如navigator.webdriver、window.chrome),极易被前端反爬系统识别;同时因进程管理粗放、渲染等待机制僵化,导致内存泄漏、僵尸进程和高并发下稳定性崩塌。本文围绕真实生产场景,系统解析浏览器指纹伪造原理、进程级资源管控策略、基于页面状态的智能等待范式,并提供Docker容器化、K8s弹性扩缩与Prometheus可观测性落地路径,助力开发者将ChromeDriver

weixin_29762151的博客 1259

浅谈LCA问题(最近公共祖先)(四种做法)

LCA(最近公共祖先问题)(倍增,RMQ,tarjan,树链剖分)

Phrvth的博客 1020

微信小程序 - 最新详细实现调起手机摄像头拍摄身份证人像面和国徽面取景框功能,在拍照相机上增加身份证证件照的轮廓或自定义文字,支持替换扫描拍摄辅助线图片及文本,小程序实现拍照身份证时带取景轮廓框拍摄!

微信小程序,身份证,证件照,人像,证件照提示框模板,vue身份证拍照框,摄像机相机里有引导内容,取景框拍摄,微信小程序实现拍照界面自定义实现,自拍人相框拍摄,取景框,户口簿取景框,画布指定区域生成图片,微信小程序身份证正反面拍照如何加入辅助图片引导照片,身份证取景框拍摄,服务器,上传,正反面,调起手机摄像头: 拍摄身份证的正反面,自定义身份证取景框,在相机上绘制 “身份证轮廓“ 与提示文字,拍摄身份证时出现人像框怎么实现,在相机上增加图片和文字,微信小程序怎么给调起的相机加入自定义图片,小程序实现给相机上面

🏆 前端领域优质创作者 3405

The merchant:tarjan算法解决LCA类问题

题意:有几个城市,在每个城市某件物品有一个价格,问一个商人从一个城市到另一个城市可以获利多少(至多买卖一次)。 这些城市构成了一棵树(N个点N-1条边),假设从城市x到城市y,则行动路线是x->LCA(x,y)->y;物品的买卖有四种情况①买和卖都在x->LCA(x,y)过程中完成,②买和卖都在LCA(x,y)->y过程中完成。③买东西在x->LCA(x,y)过程中完成,卖东西在LCA(x,y)->y过程中完成④不管怎样都赚不了钱,不进行买卖。所以对于每条路线我们要记录的

donnameの博客 1588

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

1 数据结构类-最近公共祖先LCA问题

1.淘宝面试题:有一个一亿节点的树,现在已知两个点,找这两个点的共同的祖先。 这个题怎么做呢? 本题为一道开放性试题,所以可以随意一些。下文的第二道题目则不行。 本题类型 实现特定的数据结构的一些另外要求的功能。 方法1:修改原本数据结构的内部结构。 给出的较为简单的方法:可以考虑的方案是稍微改一下树的存储结构: 1 每个结点存储一个父节点指针和在父节点中的

路漫漫其修远 606

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

使用Binary Lifting实现LCA

共有n个节点,n-1条边存储在edges中。

wqh834339683的博客 286

ecc缩点+lca

//#define LOCAL #include <bits/stdc++.h> using namespace std; #define ll long long #define mem(a, b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define DNF 0x7f #define DBG printf("this is a...

Zenith_Habitant的博客 237

LCA的暴力优化(倍增方式)

文章借鉴自:算法系列——最近公共祖先LCA(暴力,倍增算法,Tarjan) - 白菜茄子 - 博客园 (cnblogs.com)LCA其实就是树上面两个节点的的最近公共祖先。也就是说最直接暴力的解法就是将这两点先调整的统一位置,然后同时向上找祖先,如果某个高度的祖先相等了,那么就找到了。

m0_60288082的博客 226

LCA算法以及原理详解

LCA-最近公共祖先   LCA(Least Common Ancestors),即最近公共祖先,这种描述是基于树结构的,也即我们通通常只在树结构中考虑祖先问题。树实际上就是图论中的有向无环图,而要研究LCA问题,首先我们要指定树中的一个顶点为根节点,并以该节点遍历有向无环图,生成一颗DFS序下的有向树,假设我们要查询的两个节点为u,v,DFS序下根节点到两点的最短路径分别是(r,u),和(r,v),LCA就是(r,u)与(r,v)公共路径的最后一个节点,如下图所示,w即为LCA。   换句话说,u,v的

qq_37957064的博客 2万+

LCA问题(倍增法)

之前写过了LCA的两个在线算法之一:DFS+ST方法(DFS+ST)。本篇介绍另一种在线算法,用倍增思想来解决LCA问题。在学习倍增之前,先看一种倍增算法的退化版,有助于理解倍增法。 在找a和b的LCA时,先让a和b中深度较大的那一个,向上回溯到与另一个同样深度的位置上。例如下面这个图: 假设要找F和E的LCA,先让F向上回溯到他的父节点D的...

Q_M_X_D_D_的博客 1万+

树上倍增下的 LCA 问题

中深度较大的开始,先使深度较大的缩短到最接近另一个深度的节点(自己 / 最近的祖先),然后一直向上即可。给定一颗有根树,若节点 k 既是节点 x 的祖先,又是节点 y 的祖先,则称 k 是。要解决这个问题,我们还要求出每个节点的深度,可以使用 dfs 解决。的所有公共祖先中,深度最大的称为最近公共祖先,记作。步到达的祖先节点,若此节点不存在则设。因为讲解倍增,所以这里使用。在处理 LCA 时,我们以。LCA,最近公共祖先问题。的第一个中途交汇点。注:本代码用于 AC。

George110915的博客 2181

树上倍增和LCA问题

摘要:最近公共祖先(LCA)是树形结构中的核心概念,广泛应用于路径查询、距离计算等场景。本文介绍了四种LCA求解方法:朴素算法(O(n)查询)、倍增法(O(nlogn)预处理,O(logn)查询)、欧拉序+RMQ(O(nlogn)预处理,O(1)查询)和Tarjan离线算法(O(nα(n)))。重点分析了倍增法和欧拉序+RMQ的实现原理,并讨论了LCA在子树查询、路径修改、虚拟树构建等问题中的应用,最后通过例题展示了LCA的实际应用场景。

Mark1277的博客 1037

解决LCA问题的三种算法

dfs+ST,Tarjan,倍增

包络面的博客 5096

浅析LCA

1.&amp;amp;amp;amp;nbsp;1.&amp;amp;amp;amp;nbsp;1. \ 定义 LCA(Least Common Ancestors),即最近公共祖先,指对于有根树 TTT 的两个结点 uuu 、vvv ,最近公共祖先 LCA(T,u,v)LCA(T,u,v)LCA(T, u, v) 表示一个结点 xxx, 满足 xxx 是 uuu、vvv 的祖先且 xxx 的深度尽可能大。 下面给出一个自己画的图,用来解释LCA及其算...

夕弦 1万+

LCA问题

LCA(Least Common Ancestors),即最近公共祖先:在有根树中,找出某两个结点u和v最近的公共祖先(另一种说法,离树根最远的公共祖先)。        使用RMQ解决LCA问题,一篇不错的文档http://wenku.baidu.com/view/392c7023dd36a32d73758193.html,解释了两者之间的转换。 在线算法DFS+ST描述(思想是:将

新博客地址:sensirly.github.io 2139
上一篇: 各种Binary Tree定义
下一篇: 三序遍历以及Vertical Order
michaelbinwang
博客等级 码龄10年 1粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值