力扣236. 二叉树的最近公共祖先(java DFS解法)

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

文章目录

  • 题目描述
  • 思路
  • 解题方法
  • 复杂度
  • Code

题目描述

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

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

在这里插入图片描述

思路

首先我们要注意到题目所给提示**二叉树的所有节点值均不相等!!!**在此基础上我们可以得到二叉树的最近公共祖先唯一存在如下两种情况:

1.若当前节点的左子树和右子树均存在给定节点的其一,则当前节点为最近公共祖先;
2.若当前节点等于所给节点的其中一个,同时当前节点的左子树或者右子树中存在所给节点的另一个节点,则当前节点为最近公共祖先

如下图示:
image.png
image.png

解题方法

1.定义一个TreeNode类型的指针命名为location用于记录并返回最后的最近公共祖先
2.递归后续遍历二叉树,记录当前节点(包括当前节点)的左子树或右子树节点等于给定节点的个数
3.判断当前节点是否等于给定节点中其一,同时其左右子树中等于给定节点的个数(具体的判定条件看思路)判定成立时将指针location指向当前节点。
4.注意若在递归过程中发现指针location已经不为null则直接退出递归

复杂度

时间复杂度:

O ( n ) O(n) O(n)

空间复杂度:

O ( n ) O(n) O(n)

Code

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    //用于记录指定节点最近的父节点位置
    private TreeNode location = null;
   /**
     * 求取二叉树中指定两节点的最近公共父节点(二叉树任意节点值无重复)
     *
     * @param root 树的根节点
     * @param p    指定节点p
     * @param q    指定节点q
     * @return TreeNode
     */
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        depthFirstSearch(root, p, q);
        return location;
    }

    /**
     * 深度优先(此处为二叉树的后序遍历)求取某一节点指定的
     * 节点p 与 q的个数,利用其找到最近父节点的位置
     * @param root 树的根节点
     * @param p    指定节点p
     * @param q    指定节点q
     * @return int
     */
    private int depthFirstSearch(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null) {
            return 0;
        }
        //当前节点左子树包含p,q节点的个数
        int leftContains = depthFirstSearch(root.left, p, q);
        //当已经找到location时提前退出
        if (location != null) {
            return 2;
        }
        //当前节点右子树包含p,q节点的个数
        int rightContains = depthFirstSearch(root.right, p, q);
        if (location != null) {
            return 2;
        }
        //记录当前节点值等于q或p
        int rootContain = 0;
        //如果当前节点值等于p,q其一
        if (root == p || root == q) {
            rootContain = 1;
        }
        /*
        找到情况1:当当前节点值等于p,q其一时,同时当前节点的左子树
                 或右子树包含q,p的个数为1
        找到情况2:当当前节点的左子树包含一个p或q其一,同时当前节点
                 的右子树包含一个q或p其一
         */
        if (rootContain == 1 && (leftContains == 1 || rightContains == 1)) {
            location = root;
        }
        if (rootContain == 0 && leftContains == 1 && rightContains == 1) {
            location = root;
        }
        return leftContains + rightContains + rootContain;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

五种多目标优化算法(MOJS、NSGA3、MOGWO、NSWOA、MOPSO)求解微电网多目标优化调度(MATLAB代码)

一、多目标优化算法简介 (1)多目标水母搜索算法MOJS 多目标优化算法:多目标水母搜索算法MOJS(提供MATLAB代码)_水母算法-CSDN博客 (2)NSGA3 NSGA-III求解微电网多目标优化调度(M…

【MATLAB】全网入门快、免费获取、持续更新的科研绘图教程系列2

14 【MATLAB】科研绘图第十四期表示散点分布的双柱状双Y轴统计图 %% 表示散点分布的双柱状双Y轴统计图%% Made by Lwcah (公众号:Lwcah) %% 公众号:Lwcah %% 知乎、B站、小红书、抖音同名账号:Lwcah,感谢关注~ %% 更多…

【算法专题】滑动窗口—无重复字符的最长子串

力扣题目链接:无重复字符的最长子串 一、题目解析 二、算法原理 解法一:暴力解法(时间复杂度最坏:O(N)) 从每一个位置开始往后枚举,在往后寻找无重复最长子串时,可以利用哈希表来统计字符出现…

RFID技术在刀具智能管理中的应用

RFID技术在刀具智能管理中的应用 科技日新月异,工业科技的不断提升,慢慢的改变了传统制造业。RFID技术的崛起改变了传统的人工记录数据、盘点物料的方式,带来更高效、错误率低的解决方案。 刀具是生产过程中不可或缺的工具,高效管理和利用刀…

MySQL where 子句

文章目录 前言MySQL where 子句语法 从命令提示符中读取数据使用PHP脚本读取数据后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:Mysql 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力…

windows11上安装WSL

Windows电脑上要配置linux(这里指ubuntu)开发环境,主要有三种方式: 1)在windows上装个虚拟机(比如vmware)。缺点是vmware加载ubuntu后系统会变慢很多,而且需要通过samba来实现window…

acwing算法基础之数学知识--求卡特兰数

目录 1 基础知识2 模板3 工程化 1 基础知识 题目:给定n个0和n个1,它们将按照某种顺序排成长度为2n的序列,求它们能排成的所有序列中,能够满足任意前缀序列中0的个数都不少于1的个数的序列有多少个? 输出的答案对 1 0 …

【​用运算放大器设计恒流电流源电压4V-74V适应范围 ​】2021-11-29

缘由用运算放大器设计恒流电流源-编程语言-CSDN问答直流恒流源设计,要求用到运算放大器-硬件开发-CSDN问答求助恒流驱动电路,运放端口电压的问题? - 电路设计论坛 - 电子技术论坛 - 广受欢迎的专业电子论坛!(不能实现恒流坏的电路设计反面例子…

【模拟开关CH440R】2022-1-20

资料模拟开关CH440芯片手册 - 百度文库 ch440R回来了,导通usb设备没问题,降压不影响。但是我发现个严重的问题,我的电路是直接通过4067控制ch440r接地,低电平,使能三个线路连一起的,邮箱的图您看看&#xf…

C++设计模式之策略模式

策略模式 介绍示例示例测试运行结果应用场景优点总结 介绍 策略模式是一种行为设计模式。在策略模式中,可以创建一些独立的类来封装不同的算法,每一个类封装一个具体的算法,每一个封装算法的类叫做策略(Strategy),为了保证这些策…

git提交报错error: failed to push some refs to ‘git url‘

1.产生错误原因 想把本地仓库提交到远程仓库,报错信息如下 git提交报错信息 error: src refspec master does not match any error: failed to push some refs to git url 错误原因: 我们在创建仓库的时候,都会勾选“使用Reamdme文件初始化…

生态对对碰|华为OceanStor闪存存储与OceanBase完成兼容性互认证!

近日,北京奥星贝斯科技有限公司 OceanBase 数据库与华为技术有限公司 OceanStor Dorado 全闪存存储系统、OceanStor 混合闪存存储系统完成兼容性互认证。 OceanBase 数据库挂载 OceanStor 闪存存储做为数据盘和日志盘,在 OceanStor 闪存存储系统卓越性能…

分布式锁详解

文章目录 分布式锁1. [传统锁回顾](https://blog.csdn.net/qq_45525848/article/details/134608044?csdn_share_tail%7B%22type%22:%22blog%22,%22rType%22:%22article%22,%22rId%22:%22134608044%22,%22source%22:%22qq_45525848%22%7D)1.1. 从减库存聊起1.2. 环境准备1.3. 简…

220v转5V/150MA电源芯片专业替代阻容降压

标题:220V转5V/150MA电源芯片专业替代阻容降压,SOT23-3小封装,内置高压MOS管,45V-265V输入,固定5V输出,峰值电流200ma,逐周期限流、输出短路保护,片上过温保护(OTP&#…

微服务实战系列之Nginx

前言 Nginx?写了那么多文章,为什么今天才轮到它的表演?那是因为它实在太重要了,值得大书特书,特别对待。 当我们遇到单点瓶颈,第一个idea是?Nginx; 当我们需要反向代理,…

jQuery_04 jQuery选择器应用

jQuery中的选择器 1.基本选择器 1.1 id $("#id值") id名称 1.2 class $(".class值") class名称 1.3 标签选择器 $("标签名字") 标签名称 1.4 所有选择器 $("*") 所有标签 1.5 组合选择器 …

DCDC电感发热啸叫原因分析

一、电感发热啸叫原因解析 发热原因&#xff1a;电感饱和&#xff0c;实际使用的电感值<理论电感计算值 原因1&#xff1a;电感选择过小&#xff0c;计算值不合理。 原因2&#xff1a;PCB布局不合理&#xff0c;屏蔽型电感下方应设禁止铺铜区。 啸叫原因&#xff1a; 人耳的…

【IEEE独立出版 | 往届均完成检索】2024年第四届消费电子与计算机工程国际学术会议(ICCECE 2024)

#国际学术会议# 推荐 #广州# 【IEEE独立出版 | 往届均完成检索】2024年第四届消费电子与计算机工程国际学术会议&#xff08;ICCECE 2024&#xff09; 2024 4th International Conference on Consumer Electronics and Computer Engineering 2024年1月12-14日 | 中国广州 会…

Node.js入门指南(二)

目录 http模块 创建http服务端 浏览器查看 HTTP 报文 获取 HTTP 请求报文 设置响应报文 网页资源的基本加载过程 静态资源服务 hello,大家好&#xff01;上一篇文章我们对Node.js进行了初步的了解&#xff0c;并介绍了Node.js的Buffer、fs模块以及path模块。这一篇文章主…

Hibernate的三种状态

1.瞬时状态(Transient) 通过new创建对象后&#xff0c;对象并没有立刻持久化&#xff0c;他并未对数据库中的数据有任何的关联&#xff0c;此时java对象的状态为瞬时状态&#xff0c;Session对于瞬时状态的java对象是一无所知的&#xff0c;当对象不再被其他对象引用时&#xf…