当前位置: 首页 > news >正文

最低公共祖先 LCA

2.给定一棵二叉树和两个节点,找出它们的最低公共祖先(LCA)。如果节点可能不存在于树中,如何设计?

1、背景介绍

最近公共祖先(Lowest Common Ancestor, LCA):给定一棵根树和树上任意两个节点 u、v,我们需要高效找到它们的最低公共祖先节点:即在树中离根最远、深度最大,且同时是 u 和 v 祖先的节点。

2、LCA 典型应用场景

  1. 文件系统路径管理:查找两个文件 / 目录的最近公共父目录;
  2. 族谱分析:确定两人最近的共同祖先;
  3. 网络路由优化:计算树状网络中两个节点通信路径的汇聚点;
  4. 计算机图形学:骨骼动画中查找两个骨骼的最近公共父骨骼;
  5. 在线查询系统:树结构的区间查询、路径查询等高频 LCA 查询场景;
  6. 树结构问题:解决树中节点间的路径查询、距离计算(如结合DFS);
  7. 生物信息学:基因树中分析物种进化关系。

3、算法优化说明

  • 暴力法:单次查询时间复杂度 O(h)(h 为树高),海量查询效率低
  • 优化算法:倍增法、欧拉序 + RMQ、Tarjan 离线算法等
  • 重点推荐:二进制倍增法,预处理复杂度 O(log⁡n),单次查询复杂度O(log⁡n),大数据场景性能优异
方法1: 暴力法(DFS回溯)

思路: 分别记录根节点到目标节点的路径,最后比较路径的交点。
时间复杂度:

  • 预处理: 无
  • 单次查询: O(n)
方法2: 倍增算法(高效查询)

思路: 预处理每个节点的2^k级祖先,通过二进制跳跃逼近LCA。
时间复杂度:

  • 预处理: O(nlog n)
  • 单次查询: O(log n)
方法3: Tarjan算法(离线查询)

思路: 基于并查集的DFS后序遍历,适合批量查询。
时间复杂度:

  • 预处理与查询: O(n + qα(n)) (近似线性)

LeetCode 236. 二叉树的最近公共祖先

给定一个二叉树,找到该树中两个指定节点的最近公共祖先。

最近公共祖先定义:对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。

classSolution{publicTreeNodelowestCommonAncestor(TreeNoderoot,TreeNodep,TreeNodeq){if(root==null||p==root||q==root){returnroot;}TreeNodeleft=lowestCommonAncestor(root.left,p,q);TreeNoderight=lowestCommonAncestor(root.right,p,q);if(left!=null&&right!=null){returnroot;}return(left!=null)?left:right;}publicstaticvoidmain(String[]args){// 构建测试树: [3,5,1,6,2,0,8,null,null,7,4]TreeNoderoot=newTreeNode(3);root.left=newTreeNode(5);root.right=newTreeNode(1);root.left.left=newTreeNode(6);root.left.right=newTreeNode(2);root.right.left=newTreeNode(0);root.right.right=newTreeNode(8);root.left.right.left=newTreeNode(7);root.left.right.right=newTreeNode(4);Solutionsolution=newSolution();// 测试用例1: p = 5, q = 1TreeNodep=root.left;// 节点5TreeNodeq=root.right;// 节点1TreeNoderesult=solution.lowestCommonAncestor(root,p,q);System.out.println("LCA of 5 and 1 is: "+result.val);// 输出: 3// 测试用例2: p = 5, q = 4TreeNodeq2=root.left.right.right;// 节点4TreeNoderesult2=solution.lowestCommonAncestor(root,p,q2);System.out.println("LCA of 5 and 4 is: "+result2.val);// 输出: 5// 测试用例3: 节点不存在的情况TreeNodenonExistent=newTreeNode(9);// 树中不存在的节点TreeNoderesult3=solution.lowestCommonAncestor(root,p,nonExistent);System.out.println("LCA with non-existent node: "+(result3==null?"null":result3.val));// 输出: null}}
解题思路
  • 递归方法:从根节点开始,递归地遍历左子树和右子树。
    如果当前节点是其中一个目标节点(p或q),则返回该节点;
    如果在左子树和右子树中都找到了目标节点,则当前节点就是LCA;
    否则,返回非null的子节点结果。
  • 关键点:算法基于后序遍历(左-右-根),因为它需要先处理子树,再处理根节点,从而自底向上地确定LCA。
  • 边界条件:如果树为空或目标节点不存在,返回null;如果目标节点是根节点,则根节点就是LCA。
算法流程
  1. 基本检查
    1. 若当前节点为 null,返回 null
    2. 若当前节点是 p 或 q,返回当前节点(命中目标)
  2. 递归遍历
    1. 递归查找左子树,获取结果
    2. 递归查找右子树,获取结果
  3. 结果合并
    1. 左、右结果均非空 → 当前节点是 LCA
    2. 仅左结果非空 → 返回左子树结果
    3. 仅右结果非空 → 返回右子树结果
    4. 均为 null → 未找到目标节点,返回 null
总结
  1. 本题核心解法是递归后序遍历,逻辑简洁易实现,适合二叉树 LCA 基础场景
  2. 算法时间复杂度O(n),空间复杂度 O(h)(递归栈)
  3. 海量查询场景可升级为倍增法,大幅提升查询效率
http://www.jsqmd.com/news/809377/

相关文章:

  • 被毕业论文逼到崩溃?Paperxie 这套本科论文通关流,直接把流程焊死了
  • 省下一台PLC的钱:海康VC3000工控机GPIO实战,替代小型PLC控制LED和开关
  • 5G工业物联网落地困境与务实路径:从技术鸿沟到场景破局
  • 2026天虹购物卡回收必看,三大平台折扣率与到账时间全解析 - 京顺回收
  • 国产钢研纳克直读光谱仪哪家好?南京艺御城仪器有限公司代理商服务采购指南 - 品牌推荐大师1
  • 5分钟快速上手:Windows安装Android应用的终极解决方案
  • 告别AD思维!Cadence 17.4 PCB封装绘制保姆级教程(以STM32 QFN48为例)
  • 2026宁波黄金回收门店盘点,价高人少不折腾 - 奢侈品回收测评
  • OpenClaw网关守护者:自动化监控、告警与自愈实践
  • 2026年喀什太阳能路灯、高杆灯采购指南:本地源头工厂一站式解决方案 - 优质企业观察收录
  • 3大核心场景重塑游戏串流体验:Sunshine开源串流服务器深度指南
  • 终极指南:如何绕过Cursor API限制,实现免费无限使用AI编程助手
  • 终极REPENTOGON脚本扩展器安装教程:从零开始快速上手指南
  • 贵阳防雷工程甲级资质机构全景对比:如何快速锁定权威检测服务商 - 企业名录优选推荐
  • Beyond Compare 5授权管理终极指南:三种技术方案深度解析与实战应用
  • 三分钟学会Claude Code CLI常用快捷键
  • 企业信用公示平台哪家好用? - 中媒介
  • 深度解析VLC架构设计:模块化媒体引擎的技术实现与性能优化
  • 被格式逼哭的毕业生,都在用 Paperxie 解决论文排版难题
  • 腾讯音乐第一季营收79亿:经调整EBITDA为28.3亿 同比增10.5%
  • 2026年贵阳防雷检测与防雷工程:5大甲级资质权威机构深度横评与选购指南 - 企业名录优选推荐
  • 购物卡闲置?教你如何快速回收天猫超市卡! - 团团收购物卡回收
  • Workshop:为小型可信AI Agent团队设计的结构化IRC式协作中心
  • 2026年广东厂房车间监控安装TOP5!珠三角广州等地供应商解决方案商实力出众口碑佳 - 十大品牌榜
  • 模糊神经网络同步发电机励磁控制【附代码】
  • PX4电池管理系统深度解析:如何实现精准电量估算与飞行安全保护
  • OmenSuperHub终极指南:完全释放惠普OMEN游戏本性能的免费开源工具
  • M-LAG实战避坑指南:从Peer-Link故障到‘双主’风暴,一次讲清所有异常场景与恢复机制
  • 上海SCMP供应链管理专家官方报考入口及权威认证机构指南 - 众智商学院课程中心
  • 5个步骤掌握Obsidian Weread插件:打造你的数字阅读知识库