【LeetCode】升级打怪之路 Day 21:二叉树的最近公共祖先(LCA)问题

今日题目:

  • 236. 二叉树的最近公共祖先
  • 1644. 二叉树的最近公共祖先 II
  • 235. 二叉搜索树的最近公共祖先

目录

    • LCA 问题
      • LC 236. 二叉树的最近公共祖先 【classic】
      • LC 1644. 二叉树的最近公共祖先 II 【稍有难度】
      • LC 235. 二叉搜索树的最近公共祖先 ⭐⭐⭐

今天做了几道有关二叉树的最近公关祖先(LCA)问题,没有接触过的话,直接上手就能解答出来还是存在不少困难的。今天学习了相关的解题思路,寻找 LCA 问题的框架在本质上还是一个二叉树递归遍历的框架。重点需要把握好代码实现中辅助函数 find() 的语义,以及为什么这样实现。根据 LCA 可能出现的情况,实现 LCA 的寻找

LCA 问题

最近公共祖先(Lowest Common Ancestor,LCA)问题是一类问题,这类题目也存在一定的难度,因此需要认真学习一下。

labuladong 的 Git原理之最近公共祖先 这篇文章介绍了 LCA 问题的解题思路,可以参考学习一下。

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

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

这个题目就是经典的 LCA 问题。

我们想要找 p 和 q 的 LCA,那这个 LCA 有两种情况:

  • case 1:自己是 p 或 q,另一个在自己的子树上(或者也还是自己)
  • case 2:自己不是 p 或 q,其中一个在自己左子树上,另一个在自己右子树上

对于寻找 LCA 的问题,我们可以写一个 find() 辅助函数来完成递归寻找。

我们需要明确一下 find() 函数的语义:它从 root 开始寻找它认为最可能是 LCA 的节点。这里限定是“最可能”是因为,在 case 1 中,如果一个节点发现自己是 p 或 q,那它就不需要再向下找了,因为从自己这个层次上来看, 如果有 LCA 的话,那也只能是自己,不可能是再向下的子树中的节点了。至于真的是不是 LCA,就交由更上层的节点来验证,如果更上层的节点没有再找到另一个 p 或 q,那就是了。所以 find 函数只需要返回当前这个节点自认为最可能是 LCA 的节点就可以。来看代码:

236 题目

可以看到,find() 函数就是返回一个节点在自己层级上所认为的最可能是 LCA 的节点。因为题目说了一定存在 p 和 q,也就是一定存在 LCA,所以最终返回的就是 root 所认为的最可能是 LCA 的节点,它是一定存在的。

LC 1644. 二叉树的最近公共祖先 II 【稍有难度】

1644. 二叉树的最近公共祖先 II

这个题目相比于上个题目有了变动,上一个题目明确说了一定存在 LCA,但这个题目却不一定,所以在这题目中,我们无法肯定 find() 函数返回的最终结果就是 LCA,需要加一个标志位用来区分是否真的找到了 LCA。

在之前的 find() 函数的逻辑中,当一个节点自己就等于 p 或 q 之一时就返回自己作为可能的 LCA,没有再向下确定自己的子树中是否还存在另一个目标值,从而导致了这种不确定性。因为我们的遍历本质上是后序递归遍历,所以遍历一定是遍历了所有节点,也就是如果存在 p 或 q,我们是一定能遍历到的,所以我们可以加一个标志位来记录是否找到了 p 和 q。如果最终标志位说明找到了 p 和 q,那 find() 函数返回的 TreeNode 就是我们要找的 LCA 节点了。

所以这个题目的解法相比于上个题目,主要是加了个标志位:

1644
可以看到,代码整体思路与之前的一样,只是加了个标志位,用来判断最终找到的结果是不是 LCA。

LC 235. 二叉搜索树的最近公共祖先 ⭐⭐⭐

235. 二叉搜索树的最近公共祖先

这个题目也是个变形。将二叉树改为二叉搜索树,需要利用上 BST 的相关特性。

其实只当它是个二叉树的话,之前的题目的解法也能做这个题目,这个题目的难点在于如何利用上 BST 的特性。

因为我们的 find() 本质上还是递归遍历寻找目标值,如果是在 BST 上进行遍历的话,我们可以利用目标值的大小和当前值的大小进行对比,从而避免向不可能存在目标值的分支上进行查找。

为了实现“剪枝”的效果,我们这一次 find() 函数的实现中,将判断是否自己是 LCA 逻辑放到了递归之前,也就是前序的位置,这样的话,如果根据某些条件来决定出哪个子树不需要递归下去了。

代码思路及实现如下:

235 代码

做了这个题,我们就可以对寻找 LCA 问题有了更深的理解。

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

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

相关文章

一文弄清池化层(pooling)的作用

池化层的本质是一个下采样,数据经过卷积之后,维度会越来越高,在特征图没有较大改变的情况下,参数量却上涨的很快,造成模型的训练困难和过拟合现象,所以将池化层置于连续的卷积层之间,以压缩数据量和参数以减少过度拟合,对卷积层输出的特征图进行特征选择。池化层的具体操作是将…

考虑功率均分与电压频率的事件触发分布式二次控制MATLAB模型

微❤关注“电气仔推送”获得资料(专享优惠) 模型简介 此模型是在《基于事件触发机制的孤岛微电网二次电压与频率协同控制MATLAB仿真模型》上进一步创作的,之前的模型只考虑了二次电压与频率控制,并没有考虑均分这一项点。 因此…

【考研数学】打基础用张宇《30讲》还是武忠祥《基础篇》?

基础课不太可能所有的东西全都覆盖,还是先搭起一个知识框架,然后不断的填充和完善。 所以不必太过于在意少一些东西,我们不可能一口吃成胖子,基础知识肯定不会遗漏的,只可能一些技巧不到位。 从自己的情况考虑&#…

前端Vue列表组件 list组件:实现高效数据展示与交互

前端Vue列表组件 list组件:实现高效数据展示与交互 摘要:在前端开发中,列表组件是展示数据的重要手段。本文将介绍如何使用Vue.js构建一个高效、可复用的列表组件,并探讨其在实际项目中的应用。 效果图如下: 一、引言…

DETR Doesn’t Need Multi-Scale or Locality Design

论文名称:PlainDetr 发表时间:ICCV2023 开源代码 作者及组织: Yutong Lin,Yuhui Yuan等,来自西安交大,微软亚洲研究院。 前言 自Detr以来,后续paper的改进的方向:主要是将归纳偏置重新又引入进…

如何在群晖用Docker本地搭建Vocechat聊天服务并无公网ip远程交流协作

文章目录 1. 拉取Vocechat2. 运行Vocechat3. 本地局域网访问4. 群晖安装Cpolar5. 配置公网地址6. 公网访问小结 7. 固定公网地址 如何拥有自己的一个聊天软件服务? 本例介绍一个自己本地即可搭建的聊天工具,不仅轻量,占用小,且功能也停强大,它就是Vocechat. Vocechat是一套支持…

前端之用html做一个用户登陆界面

用户登陆界面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>用户注册页面</title></head> <body><form action"https://www.baidu.com" method"post">…

C语言函数—关于静态库

具体的函数声明和定义请参考上一篇文章 如果我们成为了库的开发者&#xff0c;要卖给别人C语言库&#xff0c;该怎么办呢&#xff1f; A不会写减法&#xff0c;想找你买一个函数 但是&#xff0c;他给的太少了&#xff0c;你不想把源码卖给他 那怎么办呢&#xff1f; 首先&…

如何使用vue定义组件之——父组件调用子组件数据

首先&#xff0c;准备父子容器&#xff1a; <div class"container"><my-father></my-father><my-father></my-father><my-father></my-father><!-- 此处无法调用子组件&#xff0c;子组件必须依赖于父组件进行展示 --&…

windows的vmdk文件转qcow2运行蓝屏

背景 使用qemu-img将做好的vmware虚拟机转为qcow2到gns3中运行&#xff0c;Linux、Win7、Win10都没出现蓝屏&#xff0c;但Win XP却在开机时蓝屏了&#xff0c;错误代码&#xff1a;0x0000007B 解决方案 最终在proxmox上找到方案&#xff1a;https://pve.proxmox.com/wiki/Ad…

什么是架构?架构设计原则是哪些?什么是设计模式?设计模式有哪些?

什么是架构?架构设计原则是哪些?什么是设计模式?设计模式有哪些? 架构的本质 架构本身是一种抽象的、来自建筑学的体系结构,其在企业及IT系统中被广泛应用。 架构的本质是对事物复杂性的管理,是对一个企业、一个公司、一个系统复杂的内部关系进行结构化、体系化的抽象,…

【42 Pandas+Pyecharts | 某瓣电影Top250数据分析可视化】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 查看数据描述信息2.4 将中国地区语言修改为中文 &#x1f3f3;️‍&#x1f308; 3. Pyecharts数据可视化3.1 各年份上映电影数量3.2 电…

【数据库-黑马笔记】基础-SQL

本文参考b站黑马数据库视频,总结详细全面的笔记 ,可结合视频观看1~26集 MYSQL 的基础知识框架如下 目录 一、MYSQL概述 1、数据库相关概念 2、MYSQL的安装及启动 二、SQL 1、DDL【Data Defination】 2、DML【Data Manipulation】 ①、插入 ②、更新和删除 3、 DQL【Data…

基于Java+SpringBoot+vue+element实现婚纱摄影网系统

基于JavaSpringBootvueelement实现婚纱摄影网系统 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 文章目录 基于JavaSpringBootvueelement实现婚纱摄影网系统前言介…

深度学习进阶:揭秘强化学习原理,实战应用全解析!

作为机器学习领域的一大分支&#xff0c;强化学习以其独特的学习方式吸引了众多研究者和实践者的目光。强化学习&#xff0c;顾名思义&#xff0c;是通过不断地强化与环境的交互来优化决策策略。在这个过程中&#xff0c;智能体通过试错&#xff0c;根据环境给出的奖励信号来调…

反无人机电子护栏:原理、算法及简单实现

随着无人机技术的快速发展&#xff0c;其在航拍、农业、物流等领域的应用日益广泛。然而&#xff0c;无人机的不规范使用也带来了安全隐患&#xff0c;如侵犯隐私、干扰航空秩序等。为了有效管理无人机&#xff0c;反无人机电子护栏技术应运而生。 目录 一、反无人机电子护栏…

《OWASP TOP10漏洞》

0x01 弱口令 产生原因 与个人习惯和安全意识相关&#xff0c;为了避免忘记密码&#xff0c;使用一个非常容易记住 的密码&#xff0c;或者是直接采用系统的默认密码等。 危害 通过弱口令&#xff0c;攻击者可以进入后台修改资料&#xff0c;进入金融系统盗取钱财&#xff0…

现代化的轻量级Redis桌面客户端Tiny RDM

​欢迎光临我的博客查看最新文章: https://river106.cn 1、简介 Tiny RDM&#xff08;全称&#xff1a;Tiny Redis Desktop Manager&#xff09;是一个界面现代化的轻量级Redis桌面客户端&#xff0c;支持Linux、Mac和Windows。它专为开发和运维人员设计&#xff0c;使得与Red…

电脑音频显示红叉怎么办?这里提供四种方法

前言 如果你在系统托盘中看到音量图标上的红色X,则表示你无法使用音频设备。即使音频设备未被禁用,当你运行音频设备疑难解答时,仍然会看到此错误。 你的电脑将显示已安装高清音频设备,但当你将鼠标悬停在图标上时,它将显示未安装音频输出设备。这是一个非常奇怪的问题,…

yolov8模型结构

yolov8模型结构 yolo发展历史yolov8简介yolov8模型结构 yolo发展历史 YOLOv1&#xff1a;2015年Joseph Redmon和 Ali Farhadi等 人&#xff08;华盛顿大学&#xff09; YOLOv2&#xff1a;2016年Joseph Redmon和Ali Farhadi等人&#xff08;华盛顿大学&#xff09; YOLOv3&…