当前位置: 首页 > 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.jsqmd.com/news/1078593/

相关文章:

  • 深度学习进阶:残差连接与梯度传播——从消失困境到千层网络的工程实践
  • AI艺术创作的伦理防火墙:从生成到版权的实操指南
  • itertools标准库:迭代器的高效工具集
  • 在 muShanghai × 观猹 AI 练摊集市的一次高密度体验
  • 照片总修不出“通透感“?这款AI修图神器,一键让废片变大片!
  • clusterIp 与 statefulSet+headless
  • 终极指南:Unreal Engine实时音频处理插件的完整解析
  • 理工科论文专项测评:即能同时降低知网重复率和AIGC疑似率,又不改写实验参数、学术术语的降重网站有哪些?
  • 2026实测盘点:16款降AI率工具测评,论文安全过关就靠它!
  • ML 实验管理工具链调研:Weights Biases、MLflow 与 DVC 的架构对比与选型评估
  • AI 模型部署架构:从模型服务化到 GPU 资源调度的生产级方案
  • 2026年最常用的培训机构管理系统是哪个,有哪些优点解决什么问题
  • 配置驱动机器学习流水线:从手工作坊到工业化生产的工程实践
  • 国产开源神器!一个U盘装N个系统,拷贝ISO就能启动,再也不用反复格式化!
  • 三星铺路、华为占位,苹果折叠 iPhone 登场,高端手机天花板再次上移
  • 提示工程实战指南:从语言指令到AI生产力工具
  • 长江特聘教授答辩ppt、校企联聘学者ppt制作案例、青年长江学者ppt模板
  • XSS攻击深度解析:从原理到防御的Web安全实战指南
  • Python 进阶技巧:异步迭代器与生成器管道——高并发数据流处理的工程范式
  • HarmonyOS 6.1.0 Weather Service 智慧出行与天气服务怎么设计?
  • 智慧军营部队人员车辆信息化管理系统建设方案
  • Pearcleaner:深度解析macOS应用清理的现代Swift架构实现
  • Mapper算法标签置换零模型的统计收敛性证明与工程实践
  • AI 交互体验设计:从意图理解到智能响应的用户体验优化
  • 2026年实测 OpenClaw替代智能AI体推荐 五款工具覆盖全场景降低使用门槛
  • 多协议转换:用 Go 标准库手写 gRPC 翻译网关
  • 如何用BatteryML开源工具精准预测电池寿命:新手完整指南
  • TikTok评论数据采集:从技术原理到商业应用的全链路解析
  • english-word-2026-06-25
  • 连载漫剧生成相关AI创作工具梳理