二叉树的最近公共祖先LCA

二叉树最近公共祖先(LCA)算法详解:一次 DFS 解决问题 本文探讨了如何在普通二叉树中寻找两个节点的最近公共祖先(LCA)。与二叉搜索树不同,普通二叉树不能利用值比较进行剪枝。文章分析了常见误区,指出分步查询会导致时间复杂度升高。核心解法是通过一次DFS递归,自底向上传递信息:若左右子树均含目标节点,则当前节点为LCA;否则返回非空子树结果。该方法时间复杂度O(n),空间复杂度O(n)或O(logn)。文章还比较了普通二叉树与BST的解法差异,并建议通过具体示例验证递归过程。 阅读详情


情况1:

二叉树是个二叉查找树,且root和两个节点的值(a, b)已知。

如果该二叉树是二叉查找树,那么求解LCA十分简单。


基本思想为:从树根开始,该节点的值为t,

如果t大于t1和t2,说明t1和t2都位于t的左侧,所以它们的共同祖先必定在t的左子树中,从t.left开始搜索;

如果t小于t1和t2,说明t1和t2都位于t的右侧,那么从t.right开始搜索;

如果t1<=t<= t2,说明t1和t2位于t的两侧(或t=t1,或t=t2),那么该节点t为公共祖先。

public static TreeNode getLCA1(TreeNode root,int a,int b)
	{	
		while(root!=null)
		{
			if(root.val > a && root.val > b){
				root=root.left;
			}else if(root.val < a && root.val < b){
				root=root.right;
			}else
				return root;
		}
		return null;
	}	

情况2:

普通二叉树,root未知,但是每个节点都有parent指针。

基本思想:分别从给定的两个节点出发上溯到根节点,形成两条相交的链表,问题转化为求这两个相交链表的第一个交点,即传统方法:求出linkedList A的长度lengthA, linkedList B的长度LengthB。然后让长的那个链表走过abs(lengthA-lengthB)步之后,齐头并进,就能解决了。

最近公共祖先题目

有一棵无穷大的满二叉树,其结点按根结点一层一层地从左往右依次编号,根结点编号为1。现在有两个结点a,b。请设计一个算法,求出a和b点的最近公共祖先的编号。

二叉树节点是按顺序编号,所以 父节点=子节点/2

package test;

import java.util.Scanner;

/** 
* @author xxh 	
* @date 创建时间:Aug 22, 2017 3:24:03 PM  
*/
public class LCA {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		System.out.println(getLCA(a,b));
	}

	public static int getLCA(int a, int b) {
		// TODO Auto-generated method stub
		int depthA=getDepth(a);
		int depthB=getDepth(b);
		if(depthA>depthB)
		{
			while(depthA-depthB!=0)
			{
				a=a/2;
				depthA--;
			}
		}
		if(depthA<depthB)
		{
			while(depthB-depthA!=0)
			{
				b=b/2;
				depthB--;
			}
		}
		while(a!=b)
		{
			a/=2;
			b/=2;
		}
		return a;
	}

	public static int getDepth(int a) {
		// TODO Auto-generated method stub
		int depth=0;
		while(a!=0)
		{
			depth++;
			a=a/2;
		}
		return depth;
	}
}

Tarjan(离线)算法(基于并查集和深度优先搜索dfs )

参考http://www.cnblogs.com/JVxie/p/4854719.html



二叉树最近公共祖先(LCA) 方法一:直接递归 1) 如果当前结点 root 等于NULL,则直接返回NULL 2) 如果 root 等于 p 或者 q ,那这棵树一定返回 p 或者 q 3) 然后递归左右子树,因为是递归,使用函数后可认为左右子树已经算出结果,用 left和 right 表示 4) 此时若left为空,那最终结果只要看 right;若 right为空,那最终结果只要看 left 5) 如果 left和 ri... 阅读详情

相关推荐

Python-Leetcode-二叉树的最近公共祖先(LCA)问题

最近公共祖先(Lowest Common Ancestor,LCA),详见百度百科。一个节点也可以是它自己的祖先。 面试题68 - I. 二叉搜索树的最近公共祖先 从树根开始,如果当前节点值大于p和q,那么p和q的公共祖先,一定在当前节点的左子树上。 从树根开始,如果当前节点值小于p和q,那么p和q的公共祖先,一定在当前节点的右子树上。 从树根开始,如果当前节点值介于p和q,那么该节点就是p和q的最近公共节点。 按照上面规则来做: class Solution: def lowestC

越努力 越幸运 1350

洛谷——P3884 [JLOI2009] 二叉树问题(最近公共祖先,LCA)c++

给定一颗以 1 号结点为根的二叉树,请求出其深度、宽度和两个指定节点。的最短有向路径上向根节点的边数的两倍加上向叶节点的边数。输出三行,每行一个整数,依次表示二叉树的深度、宽度和。其中宽度表示二叉树上同一层最多的结点个数,节点。第一行是一个整数,表示树的结点个数。,表示树上存在一条连接。对于全部的测试点,保证。,且给出的是一棵树。

2301_77012063的博客 1421

二叉树最近公共祖先(LCA)算法与应用详解

最近公共祖先(LCA)是树形结构中的基础算法概念,用于确定两个节点的最低层共同祖先节点。其核心原理是通过深度优先搜索或路径比较来定位交汇点,算法时间复杂度通常为O(n)。在工程实践中,LCA算法被广泛应用于版本控制系统(如Git合并基点计算)、网络路由优化和生物信息学分析等领域。针对不同场景需求,开发者可以选择朴素遍历、递归优化或基于RMQ的高效查询等实现方式。特别是在处理大规模树结构时,预处理技术和缓存机制能显著提升查询性能。理解LCA算法不仅有助于解决二叉树相关问题,也为学习更复杂的图算法奠定基础。

weixin_33326218的博客 319

二叉树——LCA问题

二叉树寻找最近公共祖先问题

chenchenchencl的博客 3849

ADC学习(3)——采样电路

第三章 采样电路

夏风喃喃的博客 3万+

OFDR解调全同弱反射光纤阵列

全同弱反射光纤光栅阵列是在一根光纤上密集刻写波长相同的WFBG,由于每个光栅的反射都比较弱,可实现一根光纤上复用成千上万个光栅,阵列上每个光栅栅区长度相同,相邻光栅之间栅距相同,呈周期性分布。2、获取测量信号:对弱栅阵列加载状态下,使用OFDR系统再次获取弱栅时域曲线,为测量信号。(这里需要注意的是对弱栅阵列加载后,不能使弱栅中心波长漂移到激光器波长扫描范围之外,若超出范围则OFDR技术不能获取弱栅反射信号,因此在选择弱栅阵列波长时尽量让其中心波长在激光器波长扫描范围中间,确保温度/应变测量范围。

m0_69386663的博客 1956

最近公共祖先(LCA)

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

weixin_42638946的博客 8024

CNC数控机床数据采集,CNC数据采集 设备联网 车间数字化

cnc数据采集 cnc机床数据采集 免受权采集 设备联网

weixin_38175277的博客 2772

二叉树LCA--leetcode236题

二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4] 输入: root = [3,5...

aeipyuan 375

基于carsim与Simulink联合仿真的车辆换道轨迹规划与轨迹跟踪模型

PID_反步控制_滑膜控制三种四旋翼无人机轨迹跟踪控制算法仿真 附带对应的说明文档,提供建模过程与仿真结果文献(英文)➕PPT 描述:采用的同一种参考轨迹,都是三维仿真 三种控制方法: [1]PID控制、[2]反步控制、[3]滑膜控制(三个仿真模型) 每个仿真均应用了同一种轨迹路径,直接运行即可出三维图,可以实现四旋翼无人机轨迹的跟踪

2501_90804007的博客 1083

Windows 10/11 下用 Docker 一键部署 CVAT 标注工具(附 WSL2 配置指南)

本文详细指导如何在Windows 10/11系统上,通过配置WSL2和Docker Desktop,实现CVAT标注工具的一键部署。内容涵盖从环境准备、Docker安装、CVAT服务启动到性能优化与安全配置的全流程,为计算机视觉开发者提供稳定高效的本地标注平台解决方案。

weixin_28839601的博客 463

面试经典(5)--二叉树最低公共祖先LCA

题目:输入二叉树的俩个节点,求它们的最低公共祖先 算法分析:我们直接来分析O(n)的算法。 比如求节点F和节点H的最低公共祖先,先求出从根节点A到F的路径,再求出A到H的路径,那么最后一个相同的节点就是最低公共祖先。A->B->D->F和A->B->E->H,最后相同的节点事B,所以最低公共祖先是B节点。求根节点到指定节点的算法先前已经更新过了,复杂度是O(n),所以总的时间复杂度是O

GetnextWindow的专栏 2118

gsplat在windows本地部署

3DGS的cuda提效和优化内存的版本gsplat,使得在有一定GPU计算能力的电脑上也能够尝尝3DGS的效果。我在2025年的开年之初尝试配置过gsplat,由于过程中遇到很多问题,最终还是有一些windows上字符编码的问题,没有跑通,最近看gsplat的github更新了3DGUT,优化了反射和二次折射,以及适用于非线性相机模型,如鱼眼相机等。在data目录下下载好了360_v2的数据,进入之后images文件夹是原始分辨率的图像,images_2是下采样系数为2的数据,以此类推。

yuleaf_csdn的博客 2370

二叉树最近公共祖先 LCA

题目: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树:  root = [3,5,1,6,2,0,8,null,null,7,4]     方法一: 注意p,q必然存...

渣渣 805

「HTML和CSS入门指南」hr 标签详解

标签是 HTML5 中用于插入水平分割线的标签,常用于在页面中添加分隔线或者段落之间的分割线。通过灵活运用 标签和属性,我们可以帮助用户更好地理解页面内容,同时也可以美化和装饰页面。在实际应用中需要注意避免过度使用 标签,以使页面看起来简洁明了。

a451319296的博客 7662

Python经典编程习题100例:第32例:相反顺序输出列表

不要自卑,去提升实力 互联网行业谁技术牛谁是爹 如果文章可以带给你能量,那是最好的事!请相信自己 加油o~ 本人初学Python,只为熟悉语法编写,大神请勿理会 点击下面链接 Python经典编程100例习题汇总 题目描述: 按相反的顺序输出列表的值。 解题思路: > 利用reverse函数逆序 代码: arr=['f','g','e','b'] print(arr) arr.reverse() print(arr) ...

优快云 精品推荐 1416

二叉树最近公共祖先(LCA)问题详解

本文介绍了二叉树中寻找两个节点最近公共祖先(LCA)的两种方法。递归方法通过深度优先搜索,判断节点在左右子树中的分布情况来定位LCA,时间复杂度为O(n)。非递归方法使用父指针映射,将问题转化为链表相交问题,通过建立父节点关系表和回溯路径来查找LCA。两种方法各有特点,递归简洁但可能栈溢出,非递归更稳定但需要额外空间存储父节点信息。

lzh20040919的博客 1194

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【LeetCode】升级打怪之路 Day 21:二叉树的最近公共祖先(LCA)问题

Day 21:二叉树的 LCA 问题

VLyb 1052

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

[LeetCode] 236. 二叉树的最近公共祖先(LCA)

LCA也忘了… 人生真是艰难qwq。 参考博客: 二叉树最近公共祖先详解(LCA问题详解 题目介绍 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树: root = [3,5,1...

pikachu_777的专栏 617

pscad IEEE标准系统搭建说明

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

leetcode 236. 二叉树的最近公共祖先LCA(后序遍历,回溯)

LCA(Least Common Ancestors),即最近公共祖先,是指在有根树中,找出某两个结点u和v最近的公共祖先。 题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先...

weixin_30763455的博客 278

【小白笔记】普通二叉树(General Binary Tree)和二叉搜索树的最近公共祖先(LCA)

遇到空地或目标,返回自己。派左和右去搜。左右都带回线索⟹\implies⟹我是 LCA。只有一边带回线索⟹\implies⟹把线索原样返回(LCA 在更深处)。两边都空手而归⟹\implies⟹返回空。递归 LCA 算法的本质:为什么必须使用后序遍历 (Post-order Traversal)的处理时机?LCA 的判断依赖于子树的“汇报”结果,而子树的结果必须先于父节点被处理。

weixin_70325224的博客 1025

二叉树的最近公共祖先(LCA)

力扣.236 前提条件:p,q必然存在树内, 且所有节点的值唯一!!! 递归思想, 对以root为根的(子)树进行查找p和q, 如果root == null || p || q 直接返回root 表示对于当前树的查找已经完毕, 否则对左右子树进行查找, 根据左右子树的返回值判断: 1. 左右子树的返回值都不为null, 由于值唯一左...

Handsome3618的博客 413

二叉树最近公共祖先LCA---解题过程问题分析

【比较容易理解的思路描述】 相当于在root为根的树中找p,q,找到了就传给它的父节点(如果找到叶子结点还没找到,那就是不存在p/q,就把null往父节点上传),一层一层向上传,可以理解为: //比如上面的例子,root[10]=4 //传给4的父节点,root[4] 结果有以下几种: (1)p,q传到某个节点root的左右子节点,那么root就是LCA (2)q传到某一层父节点的时候,这个父节点是p,那么p就是LCA (3)p传到某一层父节点的时候,这个父节点是q,那么q就是LCA (4)如果p||..

qq_37357873的博客 237

Leetcode_236. 二叉树的最近公共祖先LCA recursion

236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树:root =[3,5,1,6,2,0,8,null,null,7,4] 示例 1...

weixin_43107805的博客 184
上一篇: 有趣的排序——百度2017春招
下一篇: 数组中累加和为定值K的最长子数组长度
say_haha
博客等级 码龄13年 48粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值