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

Leetcode面试经典150题-236.二叉树的最低公共祖先

解法都在代码里,不懂就留言或者私信

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {/**题目分析:本题是经典的二叉树的递归套路问题我们要找的是最低的既包含p又包含q的树,首先是这颗树要包含p和q然后是最低,有几种情况:1. 当前树的左树有p(或者q),右树有q和p2. 当前树的根节点就是p(或者q),然后它的左孩子或者右孩子包含q(或者p)如果某个子树已经包含他们的公共祖先了就一路传递到root所有我们对于每棵树是需要以下信息:1. 是否包含p2. 是否包含q3. p和q的公共祖先是谁(有就设置,没有就为null)把这三个信息定义成Info类,最后拿到root然后拿到公共祖先这个值就行了*/public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {Info info = getInfo(root, p, q);return info.lowestCommonAncestor;}public Info getInfo(TreeNode root, TreeNode p, TreeNode q) {/**关于空节点的特殊处理,这里不返回null,不然后面的非空判断太多 */if(root == null) {return new Info(false, false, null);}/**拿到左右孩子的Info信息 */Info leftInfo = getInfo(root.left,p,q);Info rightInfo = getInfo(root.right,p, q);/**这里我做个优化,如果左右孩子已经包含最低公共祖先了,那其他信息也不重要了,把最低公共最先已经传到到树的根上就行了 */if(leftInfo.lowestCommonAncestor != null || rightInfo.lowestCommonAncestor != null) {return new Info(true, true, leftInfo.lowestCommonAncestor != null? leftInfo.lowestCommonAncestor : rightInfo.lowestCommonAncestor);}/**下面定义当前root的Info三个属性 *//**自己是p或者左右孩子包含p就是包含 */boolean containsP = root == p || leftInfo.containsP || rightInfo.containsP;/**自己是q或者左右孩子包含q就是包含 */boolean containsQ = root == q || leftInfo.containsQ || rightInfo.containsQ;/**判断当前树有没有p和q的祖先:1.左右某个子树包含最低公共祖先 2.当前节点是p(q),子树包含q(p) 3.左子树包含p(q),右子树包含q(p)方法开头的优化我们已经判断了某个子树包含最低公共祖先的情况,也就是我们只需要判断2,3就行了*/TreeNode lowestCommonAncestor = (root == p && (leftInfo.containsQ || rightInfo.containsQ)) || (root == q && (leftInfo.containsP || rightInfo.containsP))|| (leftInfo.containsP && rightInfo.containsQ) || (leftInfo.containsQ && rightInfo.containsP)? root : null;return new Info(containsP, containsQ, lowestCommonAncestor);}static class Info {boolean containsP;boolean containsQ;TreeNode lowestCommonAncestor;public Info(boolean containsP, boolean containsQ, TreeNode lowestCommonAncestor) {this.containsP = containsP;this.containsQ = containsQ;this.lowestCommonAncestor = lowestCommonAncestor;}}
}

运行结果:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 保研考研机试攻略:第二章——入门经典(2)
  • LVS(Linux virual server)
  • 排序算法——插入排序
  • “华为杯”第十六届中国研究生数学建模竞赛-C题:视觉情报信息分析
  • rust pin_project的使用
  • 算法经典题目:Insert Interval
  • 深入了解HTML链接:从基础到进阶——WEB开发系列06
  • C# 不使用 `async` 和 `await` 的常见场景
  • STC-ISP升级MCU
  • HCIE学习笔记:IPV6 地址、ICMP V6、NDP 、DAD (更新补充中)
  • 【路由器】RT-AC88U华硕配置DNS
  • 博客标题: 在 Spring Boot 中使用策略模式实现灵活的订单处理
  • 经纬恒润荣获小米汽车优秀质量奖!
  • SpringBoot统一功能处理——统一数据返回格式
  • 卷积神经网络 - 卷积神经网络与深度学习的历史篇
  • 深入了解以太坊
  • ➹使用webpack配置多页面应用(MPA)
  • IP路由与转发
  • Linux CTF 逆向入门
  • Linux中的硬链接与软链接
  • Mocha测试初探
  • php的插入排序,通过双层for循环
  • windows下使用nginx调试简介
  • 构建工具 - 收藏集 - 掘金
  • 浏览器缓存机制分析
  • 批量截取pdf文件
  • 前端技术周刊 2019-02-11 Serverless
  • 我是如何设计 Upload 上传组件的
  • 中文输入法与React文本输入框的问题与解决方案
  • Semaphore
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • !$boo在php中什么意思,php前戏
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (55)MOS管专题--->(10)MOS管的封装
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (MATLAB)第五章-矩阵运算
  • (二)PySpark3:SparkSQL编程
  • (二十六)Java 数据结构
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (算法)大数的进制转换
  • (推荐)叮当——中文语音对话机器人
  • (转载)从 Java 代码到 Java 堆
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .equals()到底是什么意思?
  • .NET单元测试
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • @vueup/vue-quill使用quill-better-table报moduleClass is not a constructor
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [ASP.NET 控件实作 Day7] 设定工具箱的控件图标