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

【基础算法精讲 12】二叉树的最近公共祖先

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

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

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

思路:1.当前节点是空节点,直接返回空节点2.当前节点是p节点,那么返回p节点,不需要往下递归。假设当前节点是p节点,那么q节点有两种情况:一是作为p节点的孩子(孙子)节点,那么它们的公共祖先仍是p节点。二是q节点不和p节点在同一棵子树上,那么也没必要往下递归。3.当前节点是q节点,那么返回q节点,不需要往下递归4.如果p,q节点都在当前节点的左子树,那么递归左子树即可(只有左子树能找,返回递归左子树的结果) 如果p,q节点都在当前节点的右子树,那么递归右子树即可(只有右子树能找,返回递归右子树的结果) 如果p,q节点分别在当前节点的左子树和右子树,那么公共祖先是当前节点。5.如果p,q节点不在当前节点的左右子树,返回空节点即可。也就是情况1。 代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } *//** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */classSolution{publicTreeNodelowestCommonAncestor(TreeNoderoot,TreeNodep,TreeNodeq){if(root==null||root==p||root==q){returnroot;}TreeNodeleft=lowestCommonAncestor(root.left,p,q);TreeNoderight=lowestCommonAncestor(root.right,p,q);if(left!=null&&right!=null){returnroot;}// 如果只有左子树找到,就返回左子树的返回值// 如果只有右子树找到,就返回右子树的返回值// 如果左右子树都没有找到,就返回 null(注意此时 right = null)returnleft!=null?left:right;}}

235. 二叉搜索树的最近公共祖先

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

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

思路:需要根据二叉搜索树的性质。 情况1ifp.val<root.val and q.val<root.val。则需要递归当前节点左子树。 情况2ifp.val>root.val and q.val>root.val。则需要递归当前节点右子树。 情况3ifp.val<root.val and q.val>root.val。最近公共祖先就是当前节点。ifp.val>root.val and q.val<root.val。最近公共祖先就是当前节点。ifroot==p or root==q。返回当前节点即可。 ps:为什么这题不需要判断空节点? 已知题目给出p、q 为不同节点且均存在于给定的二叉搜索树中。那么p和q节点一定存在在树中,并且可以根据当前节点的值和p,q的值提前比对,就能知道p,q是在左子树中,还是在右子树中。而上一题需要判断空节点的原因是,不像本题一样能够提前判断p,q节点在哪颗子树中,可能递归当前子树没有p或者q节点,所以需要判断空节点。 代码:classSolution{publicTreeNodelowestCommonAncestor(TreeNoderoot,TreeNodep,TreeNodeq){intcur=root.val;if(p.val<cur&&q.val<cur){returnlowestCommonAncestor(root.left,p,q);}if(p.val>cur&&q.val>cur){returnlowestCommonAncestor(root.right,p,q);}returnroot;}}
http://www.cnnetsun.cn/news/3010709.html

相关文章:

  • AI 生成动效代码:从自然语言描述到可运行 CSS 动画的编译管线
  • 【设计书+项目源码】基于YOLOv8+Flask的电动车进电梯检测系统
  • TrollInstallerX:基于双漏洞利用机制的TrollStore部署方案
  • 2026年AI工程师高薪赛道指南:大模型/AIGC风口+济南岗位缺口解析!
  • 翻译公司2026视频口译十强榜揭晓!视频口译画质清晰
  • 在 muShanghai × 观猹 AI 练摊集市的一次高密度体验
  • Debian/Ubuntu 新版系统(Python3.11+)的 PEP 668 外部环境保护机制,不允许直接在系统全局 Python 用 pip 安装包,优先推荐虚拟环境
  • Linux命令-pwconv(从 /etc/passwd 创建 /etc/shadow 影子密码)
  • 中小企业建站困境:为什么“便宜“反而最贵?
  • 职场部门汇报PPT制作工具怎么选?我的长期实测心得
  • PySpark + Delta Lake 实现生产级 Type 2 SCD 最佳实践
  • Spaceship Titanic机器学习入门:二分类实战与特征工程精要
  • TscanPlus:一站式内网安全扫描工具实战配置与优化指南
  • PySpark入门实战:从单机Pandas到TB级分布式数据处理
  • 用cleanlab清洗标签提升XGBoost准确率:数据为中心的实战闭环
  • 【uni-app 性能调优】从 20fps 到 60fps:用“时间切片”根治复杂表单卡顿
  • 数据结构选型指南:从数组到红黑树,工程场景下的抉择逻辑
  • Okbiye 数据分析模块:不用 SPSS,自动生成可直接粘贴进论文的实证报告
  • AI智能体从18.75%到100%:GDPevo自进化基准实测,5条隐性规则如何决定业务正确性
  • Spring boot 后端项目公共基础模块的理解学习
  • Orca-2-7B数学助教实战:轻量模型+结构化提示+公式校验
  • 企业级 Agent 产品架构:从单次对话到多轮编排的商业化跃迁
  • AI 代码生成与验证:当 LLM 写算法题,靠谱程度到底有多少?
  • EVE-NG V7 PC安装部署教程(最细教程)
  • 次梯度下降收敛率分析:基于分层结构与保守集值场
  • Pandas 与 NumPy 协同数据处理:大规模特征管线的内存优化与向量化实践
  • Vue3 状态管理深潜:Pinia 与响应式原理的底层机制与选型决策
  • 大模型量化实战:从INT8到QLoRA的工程落地指南
  • flink的streaming api 统计文本中的字段个数
  • HS2-HF Patch:3步完成HoneySelect2游戏终极增强