(Java)leetcode-236 Lowest Common Ancestor of a Binary Tree(二叉树的最近公共祖先)

2023-11-16

题目描述

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

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

例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]

在这里插入图片描述
示例 1:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。
示例 2:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出: 5
解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。

说明:

所有节点的值都是唯一的。
p、q 为不同节点且均存在于给定的二叉树中。

思路

此题是leetcode-235 Lowest Common Ancestor of a Binary Search Tree (二叉搜索树的最近公共祖先)这道题的升级版。
回顾一下235这道题,该题特殊之处在于规定的是二叉搜索树,可以明确搜索目标的位置。
此题由于是普通的二叉树,只能老老实实向下遍历搜索目标,基于目标的位置,才能按照目标位置情况,返回正确的结果。

由于做出判断需要依赖下层的情况,后序遍历再适合不过了。遍历完下层节点后,再通过目标p,q的位置判断最近公共祖先是哪个节点。

  • 终止条件:
    当越过叶节点,则直接返回 null ;
    当 root 等于 p, q ,说明root就是最近公共祖先,直接返回 root ;
    在这里插入图片描述

  • 递推过程:
    开启递归左子节点,返回值记为 left ;
    开启递归右子节点,返回值记为 right ;

  • 返回值: 根据 left 和 right ,可展开为四种情况;

  1. 当 left 和 right 同时为空 :说明 root 的左 / 右子树中都不包含 p,q ,返回 null ;
  2. 当 left 和 right 同时不为空 :说明 p, q 分列在 root 的 异侧 (分别在 左 / 右子树),因此 root 为最近公共祖先,返回 root ;
  3. 当 left 为空 ,right不为空 :p,q都不在 root 的左子树中,直接返回 right 。具体可分为两种情况:
    (1)p,q 其中一个在 root 的 右子树 中,此时 right 指向 p(假设为 p );
    在这里插入图片描述

(2)p,q 两节点都在 root 的 右子树 中,此时的 right 指向 最近公共祖先节点 ;
在这里插入图片描述
4. 当 left 不为空 , right 为空 :与情况 3. 同理;

情况 1. 可合并至 3. 和 4. 内。

代码

public class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null || root == p || root == q)  return root; // 终止条件
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        if(left != null && right != null)   return root; // 情况2
        return left != null ? left : right; // 情况1,3,4
    }
}

执行用时:7 ms, 在所有 Java 提交中击败了99.90%的用户
内存消耗:42 MB, 在所有 Java 提交中击败了5.71%的用户

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(Java)leetcode-236 Lowest Common Ancestor of a Binary Tree(二叉树的最近公共祖先) 的相关文章

随机推荐

  • Linux 入门常用命令(ZT)

    1 Linux进入与退出系统 进入Linux系统 必须要输入用户的账号 在系统安装过程中可以创建以下两种帐号 1 root 超级用户帐号 系统管理员 使用这个帐号可以在系统中做任何事情 2 普通用户 这个帐号供普通用户使用 可以进行有限的操
  • MATLAB——求冲激响应和阶跃响应

    题目 已知一个RLC串联振荡电路系统函数为 其中L 22mH C 2000pF R 100 求其时域的冲激响应和阶跃响应 代码解释 这段代码定义了三个变量 电感L 电容C和电阻R 然后 定义了两个数组a和b 它们是差分方程的系数 接下来 使
  • 拿不到年薪25W全额退款

    速报 2023年经济下行趋势明显 毕业生出路在哪儿 今年 毕业人数将达到1158万 导致很多公司招聘非常谨慎 要求也变得非常更高 别说offer 现在出门找个实习都难 大学四年我都学了啥 是啊 现在咋找实习丰富简历啊 今年毕业的我该怎么办
  • selenium自动处理验证码

    自动化测试中的验证码处理方法小总结 转自 Selenium中文论坛 gt Selenium RC gt 转 自动化测试中的验证码处理方法小总结 原作者 yanpingsha 目前 不少网站在用户登录 用户提交信息等登录和输入的页面上使用了验
  • kubernetes ——网络存储nfs

    kubernetes 网络存储nfs 一 共享的机器上安装nfs 1 yum y insstall nfs utils 2 mkdir p etc exports 3 vi etc exports ifs kubernetes rw no
  • 恶意代码分析实战——Lab03-01.exe基础动态分析篇

    恶意代码分析实战 Lab03 01 exe基础动态分析篇 1 实验目的 综合运用各种分析工具 分析Lab03 01 exe的基本信息 并推测其功能 2 实验环境 硬件 软件 VMware虚拟机 winxp 硬件 处理器Intel Core
  • 浅谈Class.forName()在JDBC中的作用

    目录 1 Class forName 有什么作用呢 2 为什么不直接new 3 为什么删除Class forName com mysql jdbc Driver 还是可以运行 JDBC是Bridge模式的典型应用 DriverManager
  • 怎么在matlab项目中找到某个变量或函数(必行)

    怎么在matlab项目中找到某个变量或函数 必行 1 首先将当前文件路径设置到项目所在文件夹 2 单击 编辑器 下的 查找文件 功能键 3 在 查找包含以下文本的文件 对话框内输入你要搜索的文本 并在 仅包括以下文件类型 对话框选择相应类型
  • cocos2d-x 卡牌翻牌效果的实现

    cocos2d x 卡牌翻牌效果的实现 2012年07月25日 综合 共 3085字 字号 小 中 大 评论关闭 猴子原创 欢迎转载 转载请注明 转载自Cocos2D开发网 Cocos2Dev com 谢谢 原文地址 http www co
  • Java8 HashMap源码解析(内部存储结构及实现方式详解)

    HashMap是我们日常使用的非常多的java集合框架下的一员 它是基于哈希表的 Map 接口的实现 以key value的形式存在 我们可以通过key快速地存 取value 本文以基于 JDK1 8 为源码 简单梳理了一下hashMap的
  • 西瓜书(周志华):什么是版本空间以及如何求取版本空间

    下面是自己结合百度的资料来理解的一些比较通俗的说法 假设空间 属性所有可能取值组成的可能的样本 版本空间 与已知数据集一致的所有假设的子集集合 绿色加号代表正类样本 红色小圈代表负类样本 GB 是最大泛化正假设边界 maximally Ge
  • 【管理篇 / 登录】❀ 01. 网线连接登录 ❀ FortiGate 防火墙

    简介 当我们拿到新的防火墙的时候 首先要做的就是将电脑快速 简便的连接到防火墙 登录并进行管理 而最方便的连接方式就是用网线了 这里介绍的是最简单的飞塔防火墙物理连接以及浏览器登录访问 桌面式防火墙网线连接 飞塔防火墙产品线里低端的桌面式防
  • 对象转换为JSON数据格式&使用JQuery获取数据

    将对象转换为JSON数据格式 我们需要json lib 2 3 jdk15 jar架包 当然还需要其它架包 来实现对象转JSON数据格式 此架包提供两个类来实现转换 JSONObject fromObject object 将对象转换成js
  • Python爬虫编程实践--re bs及xpath

    Beautiful Soup库入门 Beautiful Soup 是一个HTML XML 的解析器 主要用于解析和提取 HTML XML 数据 它基于HTML DOM 的 会载入整个文档 解析整个DOM树 因此时间和内存开销都会大很多 所以
  • 共识算法-PBFT

    简介 1 PBFT简介 BFT Byzantine Fault Tolerance 是区块链共识算法中需要解决的一个核心问题 例如 公有链网络中 比特币和以太访中用的是POW EOS用的是DPOS PBFT一般用于联盟链场景中 它是共识节点
  • Vivado时序约束(转载)

    Vivado时序约束 本文主要介绍如何在Vivado设计套件中进行时序约束 原文出自Xilinx中文社区 Timing Constraints in Vivado UCF to XDC Vivado软件相比于ISE的一大转变就是约束文件 I
  • vue3 父子组件传参

    父向子传参 父组件
  • bootstrap table复选框选多页勾选

    bootstrap table复选框选多页勾选 在项目中发现 bootstrap table的复选框选中后 翻页操作会导致上一页选中的丢失 api中的 bootstrapTable getSelections 只能拿到当前页的复选框 js
  • 正则表达式大全

    1 匹配中文 u4e00 u9fa5 2 英文字母 a zA Z 3 数字 0 9 4 匹配中文 英文字母和数字及下划线 u4e00 u9fa5 a zA Z0 9 同时判断输入长度 u4e00 u9fa5 a zA Z0 9 4 10 5
  • (Java)leetcode-236 Lowest Common Ancestor of a Binary Tree(二叉树的最近公共祖先)

    题目描述 给定一个二叉树 找到该树中两个指定节点的最近公共祖先 百度百科中最近公共祖先的定义为 对于有根树 T 的两个结点 p q 最近公共祖先表示为一个结点 x 满足 x 是 p q 的祖先且 x 的深度尽可能大 一个节点也可以是它自己的