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

【Leetcode 热题 100】236. 二叉树的最近公共祖先

问题背景

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

数据约束

  • 树中节点数目在范围 [ 2 , 1 0 5 ] [2, 10 ^ 5] [2,105] 内。
  • − 1 0 9 ≤ N o d e . v a l ≤ 1 0 9 -10 ^ 9 \le Node.val \le 10 ^ 9 109Node.val109
  • 所有 N o d e . v a l Node.val Node.val 互不相同 。
  • p ≤ q p \le q pq
  • p p p q q q 均存在于给定的二叉树中。

解题过程

首先要想明白一种情形,如果递归到某个节点,发现题中所要求的两个节点分别在这个节点的两棵子树中,那么它就是答案,由两个条件保证:

  • 这个节点以上(往根节点的方向)的节点,不管是不是公共祖先,都一定不满足 最近 这个要求。
  • 这个节点以下(往子树的方向)的节点,必然不满足同时是两棵子树的根节点,但是要求的两个节点分别在两棵子树上。这就意味着,这些节点都不可能成为公共祖先。

在此基础上,如果当前节点是题中要求的其中某一个节点,那么它就是答案。
剩下的情况,遇到空节点返回空是常规此操作;递归的过程中只在左右子树上找到相应的节点,那就只返回递归相应子树的结果;如果在子树上都没有找到,同样返回空。

具体实现

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
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;}// 返回递归子树时得到的非空的结果,两者都为空时随便返回哪个都可以,合并到 right 中return left != null ? left : right;}
}
http://www.lryc.cn/news/508141.html

相关文章:

  • Go框架比较:goframe、beego、iris和gin
  • Kafka Streams 在监控场景的应用与实践
  • 数据结构 -- 二叉树
  • redis数据转移
  • Ubuntu Netlink 套接字使用介绍
  • spring boot密码加密方式
  • springboot根据租户id动态指定数据源
  • 使用C语言编写UDP循环接收并打印消息的程序
  • 【AI】✈️问答页面搭建-内网穿透公网可访问!
  • 计算机毕业设计原创定制(免费送源码):NodeJS+MVVM+MySQL 樱花在线视频网站
  • ECharts热力图-笛卡尔坐标系上的热力图,附视频讲解与代码下载
  • 【Lua热更新】下篇
  • Facebook 与数字社交的未来走向
  • 微信小程序实现二维码海报保存分享功能
  • Android 搭建AIDL Client和Server端,双向通信
  • 深度学习从入门到精通——图像分割实战DeeplabV3
  • STM32-笔记5-按键点灯(中断方法)
  • C++ 只出现一次的数字 - 力扣(LeetCode)
  • C++设计模式:享元模式 (附文字处理系统中的字符对象案例)
  • android EditText密码自动填充适配
  • LeetCode 刷题笔记
  • 【Java基础面试题034】Java泛型擦除是什么?
  • 使用ssh命令远程登录服务器的两种便捷方式:简化ssh命令、创建bat文件
  • access数据库代做/mysql代做/Sql server数据库代做辅导设计服务
  • 第十七届山东省职业院校技能大赛 中职组“网络安全”赛项任务书正式赛题
  • Android学习(五)-Kotlin编程语言-面向对象中的 继承-构造函数-接口三模块学习
  • 滑动窗口 + 算法复习
  • 贪心算法 greedy
  • 基于python的家教预约网站-家教信息平台系统
  • 基于深度学习多图像融合的屏幕缺陷检测方案