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

news2024/11/19 4:14:58

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

难度中等

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

百度百科中最近公共祖先的定义为:“对于有根树 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 均存在于给定的二叉树中。

思路

  • 如果当前节点为p或者为q,那当前节点就为最近公共祖先

  • 否则的话去左子树找p,q 最近公共祖先 返回 ,去右子树找p,q 最近公共祖先 返回

  • 如果左树右树都不为空,那就意味着左树p(q) 右树q(p) 所以最近公共祖先为root

  • 如果左子树为null,证明p,q在右子树上,返回右子树的最近公共祖先

  • 如果右子树为null,证明p,q在左子树上,返回左子树的最近公共祖先

  • 左树右树都没有找到返回null

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null||p==root||q==root) return root;//如果当前节点为p或者为q,那当前节点就为最近公共祖先
        TreeNode left = lowestCommonAncestor(root.left,p,q);//否则的话去左子树找p,q 最近公共祖先 返回
        TreeNode right = lowestCommonAncestor(root.right,p,q);//否则的话去右子树找p,q 最近公共祖先 返回
        if(left!=null&&right!=null) return root;//如果左树右树都不为空,那就意味着左树p(q) 右树q(p) 所以最近公共祖先为root
        if(left==null&&right!=null){//如果左子树为null,证明p,q在右子树上,返回右子树的最近公共祖先
            return right;
        }else if(left!=null&&right==null){//如果右子树为null,证明p,q在左子树上,返回左子树的最近公共祖先
            return left;
        }
        //左树右树都没有找到返回null
        return null;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/163526.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法数据结构初阶篇】:随机函数

随即函数的用处非常大&#xff0c;比如可能用来用做对数器&#xff0c;生成大量随机的测试数据&#xff0c;用来验证我们写的程序是否有误&#xff0c;可以帮助我们快速定位存在错误的测试用例&#xff0c;进行debug。这里注意Java中的随机函数Math.random()是等概率的返回[0,1…

TCP/IP网络编程(4)——基于 TCP 的服务端/客户端(1)

文章目录第 4 章 基于 TCP 的服务端/客户端&#xff08;1&#xff09;4.1 理解 TCP 和 UDP4.1.1 TCP/IP 协议栈4.1.2 链路层4.1.3 IP 层4.1.4 TCP/UDP 层4.1.5 应用层4.1.6 生活小例子4.2 实现基于 TCP 的服务器/客户端4.2.1 TCP 服务端的默认函数的调用程序4.2.2 进入等待连接…

微信小程序原生开发功能合集一:微信小程序开发介绍

一、专栏介绍 本专栏主要内容为微信小程序常用功能开发过程的介绍说明&#xff0c;包括开发微信小程序常用组件的封装、常用功能的开发等&#xff0c;提供源代码、开发过程讲解视频、完整的课程等。 组件封装&#xff1a; 下拉选择组件、图片上传组件、视频上传组件、富文本组件…

C# Dictionary(字典)各种属性的用法

C# Dictionary(字典&#xff09;各种属性的用法 要使用Dictionary集合&#xff0c;需要导入C#泛型命名空间&#xff01; ​System.Collections.Generic​&#xff08;程序集&#xff1a;mscorlib&#xff09; Dictionary的描述 1、从一组键&#xff08;Key&#xff09;到一组值…

seo关键词排名下降怎么办(SEO网站关键词排名不稳定)

关键词优化网站排名突然下降是什么原因 一般来讲&#xff0c;网站的排名不会大幅度的下降&#xff0c;除非搜索引擎的流量特别小&#xff0c;而这也不是偶然发生的。网站一旦获得对应的权重或者排名&#xff0c;就不要轻易的更改板块和文章&#xff0c;甚至是文章标题之类的&a…

Allegro如何导出和导入层叠操作指导

Allegro如何导出和导入层叠操作指导 在做PCB设计的时候,需要导出或者导入层叠,Allegro升级到了172以后,支持单独导出和导入层叠,如下图 具体操作如下 导出层叠,选择setup选择Cross-section

《图机器学习》-Message Passing and Node Classification

Message Passing and Node Classification一、前言二、How do we leverage node correlation in network&#xff1f;三、Relational Classification四、Iterative classification五、Loopy Belief Propagation一、前言 现在的主要问题是&#xff1a; 给定一个网络&#xff0c…

利用idea把项目上传到不同的仓库

前言 以项目已经创建好&#xff0c;并已经和一个远程仓库地址联通的情况下。 由于GitHub经常会出现问题&#xff0c;毕竟国外的东西&#xff0c;时常会不稳定&#xff0c;所以我们有时候也会使用国产Git代码管理工具——码云。 说真的&#xff0c;码云可真的是一个好东西。要…

SpringBoot原理-自动配置-Condition

目录 分析 通过获取 run() 的返回值再获取容器中的bean Conditional() 注解 解说案例 1.导入Jedis坐标后&#xff0c;加载该Bean&#xff0c;没导入&#xff0c;则不加载 思考 spring-boot-autoconfigure condition包 ConditionalOnClass ConditionalOnBean Conditi…

Python【bs4模块】讲解

导入&#xff1a;from bs4 import BeautifulSoup#爬取某豆的电影榜单 import pprint import requests from bs4 import BeautifulSoup class pachong:#pass #这段代码的意思如果暂时没有想好在类中定义任何属性和方法&#xff0c;你可以先写pass Python就会认为这段不会运行直接…

基于GeoDa软件的省级人口经济空间分析

前言本为从地统计学角度&#xff0c;借助空间自相关的方法&#xff0c;从县域尺度&#xff0c;研究江西省各县经济发展水平之间的相关关系&#xff0c;及经济发展与人口之间的相关关系&#xff0c;直观的说明江西省2000年的经济发展状况。通过对各市第一、第二、第三产业的GDP等…

Servlet总结(未完待续)

Servlet总结一. 简介二. Servlet执行流程三. 生命周期四. 体系结构五. urlPattern配置匹配规则六. Request和Response1. Request1.1 Request继承体系1.2 Request获取请求数据API1.3 通用方式获取请求参数1.4 通用方式中文乱码解决1.5 Request请求转发2.1 Response一. 简介 Ser…

轻量级 Java 权限认证框架——Sa-Token

Sa-Token 介绍 Sa-Token 是一个轻量级 Java 权限认证框架&#xff0c;主要解决&#xff1a;登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。 Sa-Token最新开发文档地址&#xff1a;https://sa-token.cc Sa-Token功能结构图…

MySQL最左匹配原则

说到最左匹配原则&#xff0c;我们还得先从组合索引说起。 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS user; CREATE TABLE user (id int(5) NOT NU…

【Java AWT 图形界面编程】LayoutManager 布局管理器 ⑥ ( BoxLayout 布局 )

文章目录一、BoxLayout 布局二、BoxLayout 布局 API三、BoxLayout 布局代码示例1、BoxLayout 布局垂直排列代码示例2、BoxLayout 布局水平排列代码示例一、BoxLayout 布局 BoxLayout 布局 不是 AWT 中的布局 , 而是 Swing 中引入的 ; 在 BoxLayout 布局 中 , 可以 在 垂直 和 …

[Effective Objective] 对象、消息、运行期

对象&#xff1a;“对象”&#xff08;object&#xff09;就是“基本构造单元”(building block)&#xff0c;开发者可以通过对象来储存并传递数据。 消息&#xff1a;在对象之间传递数据并执行任务的过程就叫做“消息传递”&#xff08;Messaging&#xff09;。 运行期&…

最粗暴的方法实现一个栈

对于栈和队列是一个很简单的知识&#xff0c;用的感觉也不是很多&#xff0c;但是&#xff0c;我们仍然的学习&#xff01;&#xff01;加油&#xff01;&#xff01;在实现最简单的栈之前&#xff0c;我们需要简单了解一下栈是什么&#xff1f;&#xff1f;栈&#xff08;stac…

iplatform平台简介

前置条件&#xff1a;原则规范一&#xff09;统一技术栈1&#xff09;关于JDK统一使用Open JDK&#xff0c;版本最低1.8&#xff0c;几年后可能会升级到17&#xff1b;避免使用Sun JDK&#xff0c;这是商业软件&#xff0c;而且包含部分私有&#xff08;com.sun&#xff09;类库…

pandas 实战:分析三国志人物

简介 背景 Pandas 是 Python 的一个工具库&#xff0c;用于数据分析。由 AQR Capital Management 于 2008 年 4 月开发&#xff0c;2009 年开源&#xff0c;最初被作为金融数据分析工具而开发出来。Pandas 名称来源于 panel data&#xff08;面板数据&#xff09;和 Python d…

基于SEIR模型的传染病预测软件开发(完整代码+数据集+报告)

1 操作页面及用户使用说明(1) 界面说明App页面主要分为4个区域&#xff0c;分别是&#xff1a;曲线显示区、模型初始化和预防参数设定区、传染病特征参数设定区、绘图控制区。① 曲线显示区&#xff1a;显示模型预测的不同人数量随时间的变化曲线。② 模型初始化和预防参数设定…