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

news/2024/10/22 23:28:49/

1.问题

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

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

示例 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 。因为根据定义最近公共祖先节点可以为节点本身。

示例 3

输入:root = [1,2], p = 1, q = 2
输出:1

提示

  • 树中节点数目在范围 [2, 105] 内。
  • -109 <= Node.val <= 109
  • 所有 Node.val 互不相同 。
  • p != q
  • p 和 q 均存在于给定的二叉树中。

2.解题思路

2.1 祖先的定义

若节点p位于root根节点的左或右子树,或者p就是root,则root为p的祖先。

2.2 最近公共祖先

设节点 root 为节点 p,q 的某公共祖先,若其左子节点 root.left 和右子节点 root.right 都不是 p,q 的公共祖先,则称 root 是 “最近的公共祖先” 。

对于二叉树中的节点p,q,只可能存在两种关系:

  • 父子(或祖孙)关系
  • 兄弟关系

2.3 父子关系

对于具有父子关系的节点p,q,存在两种情况:

  • 节点p是节点q的子孙节点,即节点p出现在节点q的左或右子树中,返回q即可
  • 节点q是节点p的子孙节点,即节点q出现在节点p的左或右子树中,返回p即可

2.4 兄弟关系

节点p,q分别出现在某节点的左子树或右子树中,返回该节点即可

3.代码

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {/*** 节点p和节点q只有两种关系:父子关系 兄弟关系* 父子关系: *       1.节点p是节点q的子孙节点,即节点p出现在节点q的左或右子树中;返回q即可;*       2.节点q是节点p的子孙节点,即节点q出现在节点p的左或右子树中;返回p即可;* 兄弟关系:*       节点p,q分别出现在某节点的左子树或右子树中;返回该节点即可;**/public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root==null||root==p||root==q){return root;}TreeNode leftRes=lowestCommonAncestor(root.left,p,q);TreeNode rightRes=lowestCommonAncestor(root.right,p,q);//p,q在某节点左子树和右子树中,返回根节点if(leftRes!=null&&rightRes!=null){return root;}return leftRes==null?rightRes:leftRes;}
}

http://www.ppmy.cn/news/57461.html

相关文章

Linux驱动之input输入子系统

输入子系统用于实现Linux系统输入设备&#xff08;鼠标 键盘 触摸屏 游戏杆&#xff09;驱动的一种框架。Linux内核将其中的固定部分放入内核&#xff0c;驱动开发时只需要实现其中的不固定部分&#xff08;主要还是和硬件相关的部分&#xff09;&#xff0c;这和platform设备…

【五一创作】人工智能前沿知识

人工智能是一种在计算机系统中模拟人类智能和思维的技术。近年来&#xff0c;人工智能技术得到了飞速发展&#xff0c;涉及到了各个领域&#xff0c;如自然语言处理、计算机视觉、智能机器人等。在这篇文章中&#xff0c;我将介绍人工智能的前沿知识。 一、深度学习 深度学习…

武忠祥老师每日一题||不定积分基础训练(三)

有理函数不定积分: ∫ 1 x 1 x 3 d x \int \frac{1x}{1x^3}\,{\rm d}x ∫1x31x​dx ∫ 1 x ( 1 x ) ( 1 − x x 2 ) d x ( 1 ) \int \frac{1x}{(1x)(1-xx^2)}\,{\rm d}x(1) ∫(1x)(1−xx2)1x​dx(1) ∫ 1 x 2 − x 1 d x ( 2 ) \int \frac{1}{x^2-x1} \,{\rm d}x(2)…

Windows安装rabbitmq

Windows安装rabbitmq 一、下载1、下载erlang2、下载rabbitmq 二、安装1、安装erlang2、安装rabbitmq3、简单使用 一、下载 1、下载erlang 点击右侧下载地址&#xff0c;跳转下载&#xff0c;点击下载 跳转后&#xff0c;点击download windows install即可下载。 2、下载rab…

14-6-进程间通信-信号量

前面学习了pipe,fifo,共享内存&#xff0c;信号。 本章将讲述信号量。 一、什么是信号量/信号量集&#xff1f; 1.什么是信号量 信号量是一个计数器。信号量用于实现进程间的同步和互斥。而可以取多个正整数的信号量被称为通用信号量。 对信号量的使用场景的解读 房间&#…

手机短信验证码登录功能的开发实录(机器识别码、短信限流、错误提示、发送验证码倒计时60秒)

短信验证码登录功能 项目分析核心代码1.外部js库调用2.HTML容器构建3.javaScript业务逻辑验证4.后端验证逻辑 总结 短信验证码是通过发送验证码到手机的一种有效的验证码系统&#xff0c;作为比较准确和安全地保证购物的安全性&#xff0c;验证用户的正确性的一种手段&#xff…

Linux学习[8]文件权限深入2 默认权限umask SUID/SGID/SBIT file指令

文章目录 前言1. 默认权限umask1.1 默认权限含义1.2 查看默认权限1.3 默认权限在文件与目录的异同 2. 特殊权限2.1 SUID2.2 SGID2.3 SBIT2.4 SUID/SGID/SBIT 权限设置2.4.1 数字法2.4.2 符号法 3. file指令 前言 在linux学习6里面&#xff0c;通过ls -al命令列出文件的所有详细…

剑指 Offer 54. 二叉搜索树的第k大节点【37】

难度等级&#xff1a;容易 上一篇算法&#xff1a; 226. 翻转二叉树【58】 力扣此题地址&#xff1a; 剑指 Offer 54. 二叉搜索树的第k大节点 - 力扣&#xff08;Leetcode&#xff09; 1.题目&#xff1a;剑指 Offer 54. 二叉搜索树的第k大节点 给定一棵二叉搜索树&#xff0c…