算法----二叉树的最近公共祖先

news2025/1/22 16:51:04

题目

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

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解决思路

解决方法

方法一:

    //https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/solution/236-er-cha-shu-de-zui-jin-gong-gong-zu-xian-jian-j/
    //没想到dfs还可以利用返回 从下往上返回东西
    fun lowestCommonAncestor(root: TreeNode?, p: TreeNode?, q: TreeNode?): TreeNode? {
        if (root == null){
            return null
        }
        if(root == p || root == q){
            return root
        }
        val left = lowestCommonAncestor(root.left, p, q)
        val right = lowestCommonAncestor(root.right, p, q)
        if (left != null && right != null){
            return root
        }
        if (left != null) {
            return left
        }
        if (right != null) {
            return right
        }
        return null
    }

方法二:

//https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/solution/er-cha-shu-de-zui-jin-gong-gong-zu-xian-by-leetc-2/
//方法二
    fun lowestCommonAncestor(root: TreeNode?, p: TreeNode?, q: TreeNode?): TreeNode? {
        val map = mutableMapOf<TreeNode, TreeNode>()
        dfs(root,map)
        val set = mutableSetOf<TreeNode>()
        var temp = p
        while (temp != null){
            set.add(temp)
            temp = map[temp]
        }
        temp = q
        while (!set.contains(temp)){
            temp = map[temp]
        }
        return temp

    }

    fun dfs(root: TreeNode?, map: MutableMap<TreeNode, TreeNode>){
        if (root == null){
            return
        }
        if (root.left != null) {
            map[root.left] = root
            dfs(root.left,map)
        }
        if (root.right != null) {
            map[root.right] = root
            dfs(root.right,map)
        }

    }

总结

1.也是自己想了两天没做出来,没想到dfs还可以利用返回 从下往上返回东西
说明思路不是很清晰
2.方法一的路径记录也不会就有点需要学习了

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

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

相关文章

轻量服务器外网访问不了的原因分析

​  轻量服务器外网访问不了原因的分析。很多用户在选择轻量服务器的时候都没考虑&#xff0c;直接就购买了&#xff0c;导致在使用的时候遇见了很多问题&#xff0c;下面我们就简单的聊聊关于轻量服务器外网无法访问的原因。 这里我们按照标题的意思可以解读为两种情况&…

2023最新互联网公司时长排行榜出炉

今天给大家分享一个对于选择公司来说另一个非常重要的参考指标&#xff1a;“互联网时长”。 我们在选择一个公司的时候&#xff0c;除了需要关注总收入package 以外&#xff0c;还需要考虑这家公司的加班时长是否人性化。 我们的工作时长是周工作小时数。法定工作时间是40小…

这8种Python加速运行技巧真棒

关注“Python专栏”微信公众号&#xff0c;回复暗号【面试大全】&#xff0c;立即领取面试题简历模板。 Python 是一种脚本语言&#xff0c;相比 C/C 这样的编译语言&#xff0c;在效率和性能方面存在一些不足。但是&#xff0c;有很多时候&#xff0c;Python 的效率并没有想象…

使用wpf做得计算器

最近在学习wpf&#xff0c;使用wpf做得计算器练手&#xff0c;实现功能增删改查&#xff0c;求平方根&#xff0c;倒数&#xff0c;取反&#xff0c;模拟实体计算器的M,MS,MC,MR功能 上面截图相关的计算为 8乘5加-2加3.2加&#xff08;9除以3的余数&#xff09;

一路乱飙,从手工测试进阶测试开发岗,“我“的测试之路不简单

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 测试人员的职能 …

StrSubstitutor和StrUtil占位符字符串替换

目录 一、commons-lang包下的StrSubstitutor1、使用场景一2、使用场景二 二、hutoo包下的StrUtil1、使用场景一2、使用场景二3、使用场景三 三、原生的三种方式 一、commons-lang包下的StrSubstitutor StrSubstitutor是commons-lang包提供的一个字符串替换类&#xff0c;整体使…

Redis实战——短信登录(二)

Redis代替session redis中设计key 在使用session时&#xff0c;每个用户都会有自己的session&#xff0c;这样虽然验证码的键都是“code”&#xff0c;但是相互不影响&#xff0c;从而确保每个用户获取到的验证码只能够自己使用&#xff0c;当使用redis时&#xff0c;redis的ke…

MCU单片机智能控制落地扇解决方案

随着科技进步和消费升级&#xff0c;消费者对电风扇的智能化需求日趋强烈。为了快速响应市场需求&#xff0c;以更低的成本打造智能电风扇。 MCU单片机智能控制落地扇解决方案以灵动微MM32SPIN040C主控。 方案采用的主控MM32SPIN040工作频率可达48MHz&#xff0c;内置16KB Fl…

虹科分享 | 拒绝自燃和爆炸,AGV电池如何进行实时监控和预测性维护?

Automated Guided Vehicle简称AGV&#xff0c;通常也称为AGV小车、自动导引运输车或无人搬运车等&#xff0c;指装备有电磁或光学等自动导引装置&#xff0c;能够沿规定的导引路径行驶&#xff0c;具有安全保护以及各种移载功能的运输车&#xff0c;通常用可充电的蓄电池来作为…

JumpServer开源堡垒机安装配置

JumpServer开源堡垒机安装与配置 一、简介二、下载与安装2.1、下载2.2、安装2.3、其他 一、简介 JumpServer 堡垒机帮助企业以更安全的方式管控和登录各种类型的资产。 支持 官网地址&#xff1a;https://www.jumpserver.org/index.html JumpServer 采用分层架构&#xff0c;…

【SNMP服务】网络杂谈(11)之什么是SNMP服务?

#2023 博客之星评选已开启–成为城市领跑者# 涉及知识点 什么是 SNMP&#xff0c;SNMP的特点&#xff0c;SNMP的服务&#xff0c;SNMP服务运行。深入了解SNMP技术。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多内容可去其主页关注下哈&#xff0c;不胜感…

Vue启用unity3D的exe

&#x1f430;个人主页&#xff1a;张清悠 &#x1f466;个人简介&#xff1a;张清悠&#xff0c;字澄澈&#xff0c;号寻梦客&#xff0c;爱好旅行、运动&#xff0c;主攻前端方向技术研发&#xff0c;副攻Unity 3D、C、Python人工智能等 &#x1f4dd;个人寄语&#xff1a;学…

parcel运行终端报错Uncaught ReferenceError: parcelRequire is not defined解决方案

我们通过指令 npm install parcel-bundler安装的parcel 运行起来会有一个报错 换个版本就好了 打开项目终端 我们先执行 npm uninstall parcel-bundler将错误的版本给他干掉 然后执行 npm install parcel安装正确的版本 然后运行项目 在浏览器中访问地址就一切正常了

如何预防DDOS和CC攻击

在当今数字化世界中&#xff0c;网络安全成为各行各业亟需解决的重要问题。最近&#xff0c;由于DDoS&#xff08;分布式拒绝服务&#xff09;和CC&#xff08;恶意咨询&#xff09;攻击事件的频繁发生&#xff0c;网络安全进一步引起了人们的关注。 据可靠消息源透露&#xff…

【SpringBoot】一、SpringBoot3新特性与改变详细分析

前言 本文适合具有springboot的基础的同学。 SpringBoot3改变&新特性 一、前置条件二、自动配置包位置变化1、Springboot2.X2、Springboot3.X 三、jakata api迁移1、Springboot2.X2、Springboot3.X3、SpringBoot3使用druid有问题&#xff0c;因为它引用的是旧的包 四 新特…

hdfs删除后空间不是释放,trash回收机制

一、现象 hdfs删除后&#xff0c;3天了还不删除&#xff0c;故排查排查问题 二、排查过程及原理 Trash机制&#xff0c;叫做回收站或者垃圾桶&#xff0c;默认情况下是不开启的。启用 Trash 功能后&#xff0c;从 HDFS 中删除某些内容时&#xff0c;文件或目录不会立即被清除&a…

【独家揭秘】微信可以自动加好友自动打招呼啦!

最近客户好友做某书内容爆了&#xff0c;每天都引流很多人来加他的微信&#xff0c;基本每天都需要花大量时间去通过好友&#xff0c;导致没有时间去做后续的维护发展客户&#xff0c;于是找到我大吐苦水&#xff0c;问我有什么办法可以解决&#xff1f; 嘿&#xff0c;这不巧了…

Python 基本数据类型(七)

文章目录 每日一句正能量Set&#xff08;集合&#xff09;Dictionary&#xff08;字典&#xff09;结语 每日一句正能量 生活里的累&#xff0c;一半源于生活本身&#xff0c;一半源于我们对待生活的态度。当我们感觉疲惫的时候&#xff0c;记得提醒自己保持一种幸福感&#xf…

二叉树OJ题:LeetCode--144.二叉树的前序遍历

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下LeetCode中第144道二叉树OJ题&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; 数据结构与算法专栏&#xff1a;数据结构与算法 个 人…

考完啦,回归!

暑假加训&#xff01;&#xff01;&#xff01; 不能到时候被学弟比下去了!!! 冲冲冲&#xff01;&#xff01;&#xff01;