【LeetCode: 面试变体: 236. 二叉树的最近公共祖先 + 数组 + 递归】

数据结构归类刷题法:从核心考点到解题模板的实战指南 数据结构是计算机科学的基础,它研究数据的组织、存储和操作方式,其核心价值在于为算法提供高效的操作载体。理解数组、链表、树、哈希表等基本结构的特性和操作原理,是解决复杂算法问题的前提。通过系统性地学习和应用这些结构,可以显著提升程序性能,优化资源使用。在算法面试、考研笔试和日常开发中,数据结构的应用无处不在,例如使用哈希表实现快速查找,利用栈处理递归逻辑。本文聚焦于**归类刷题**这一高效学习方法,旨在帮助学习者通过**模式识别**和提炼通用模板,将零散的题目归纳为有限的题型,从而构建系统的解题知识体系,实现 阅读详情

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,优快云-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述
在这里插入图片描述

🚩 题目链接

⛲ 题目描述

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

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

🌟 求解思路&实现代码&运行结果


⚡ 数组 + 递归

🥦 求解思路
  1. 方法参数:
    • root:存储二叉树节点值的数组。
    • p:需要查找最近公共祖先的第一个节点的值。
    • q:需要查找最近公共祖先的第二个节点的值。
    • index:当前正在处理的节点在数组中的索引。
  2. 递归逻辑:
    • 边界条件:当 index 超出数组范围或者当前位置的值为 -1(代表无效节点)时,返回 -1。
    • 节点匹配:若当前节点的值等于 p 或者 q,直接返回该节点的值。
    • 递归调用:分别对左子节点(索引为 2 * index + 1)和右子节点(索引为 2 * index + 2)进行递归调用。
  3. 结果判断:
    • 若左子树和右子树的返回结果都不为 -1,表明当前节点是最近公共祖先,返回当前节点的值。
    • 若左子树的返回结果不为 -1,返回左子树的结果。
    • 否则返回右子树的结果。
  4. main 方法:
    • 定义数组 root 来表示二叉树,同时指定 p 和 q 的值。
    • 从根节点的索引 0 开始调用 lowestCommonAncestor 方法,将结果打印输出。
  5. 细节注意:
    • 使用 2 * i 和 2 * i + 1 作为左右子树索引需要满足数组索引从 1 开始存储的前提条件
  6. 有了基本的思路,接下来我们就来通过代码来实现一下。
🥦 实现代码
public class LowestCommonAncestorInArray {

    // 查找最近公共祖先的核心方法
    public static int lowestCommonAncestor(int[] root, int p, int q, int index) {
        // 如果当前索引超出数组范围,或者当前位置的值为无效值(这里假设 -1 表示无效),返回 -1
        if (index >= root.length || root[index] == -1) {
            return -1;
        }
        // 如果当前节点的值等于 p 或者 q,直接返回当前节点的值
        if (root[index] == p || root[index] == q) {
            return root[index];
        }
        // 递归查找左子树中 p 和 q 的最近公共祖先
        int left = lowestCommonAncestor(root, p, q, 2 * index);
        // 递归查找右子树中 p 和 q 的最近公共祖先
        int right = lowestCommonAncestor(root, p, q, 2 * index + 1);

        // 如果左子树和右子树都找到了非 -1 的结果,说明当前节点就是最近公共祖先
        if (left != -1 && right != -1) {
            return root[index];
        }
        // 若左子树找到了结果,返回左子树的结果
        if (left != -1) {
            return left;
        }
        // 否则返回右子树的结果
        return right;
    }

    public static void main(String[] args) {
        int[] root = {3, 5, 1, 6, 2, 0, 8, -1, -1, 7, 4};
        int p = 5;
        int q = 1;
        // 从根节点索引 0 开始调用查找方法
        int result = lowestCommonAncestor(root, p, q, 1);
        System.out.println("最近公共祖先的值是: " + result);
    }
}

💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

美团一面复盘:八股文追问+代码输出题+二叉树LCA实战 技术面试是检验候选人基础功底与工程思维的关键环节,尤其对于Java后端开发者而言,从并发编程到JVM内存模型,从缓存一致性到消息队列性能优化,每个知识点都可能成为面试官深挖的切入点。理解底层原理,如TCP连接状态迁移、HashMap红黑树阈值设定、Kafka顺序写与零拷贝机制,能帮助候选人在高密度问答中从容应对。实际面试中,除了八股文问答,代码输出题往往考察语言规范与未定义行为的敏感度,算法手撕则聚焦二叉树、动态规划等高频题型。美团一面作为秋招典型场景,通过项目追问、缓存方案边界讨论、LCA算法优化等环节, 阅读详情

相关推荐

LeetCode高效刷题全攻略:从环境搭建到实战模板的系统方法论

算法与数据结构是计算机科学的核心基础,它们通过特定的逻辑组织和操作规则,为解决复杂问题提供高效方案。其原理在于将问题抽象为可计算模型,利用时间与空间复杂度的权衡来优化性能。掌握这些基础对于提升编程能力、优化系统性能具有重要技术价值,广泛应用于搜索引擎、推荐系统、数据库索引等场景。本文聚焦于LeetCode刷题实践,系统性地分享了从环境配置、科学路线规划到高频题型模板的完整方法论,旨在帮助开发者通过刻意练习,将算法知识内化为解决实际编码问题的能力,有效应对技术面试中的动态规划与二分查找等经典考察点。

weixin_34115824的博客 406

[LeetCode] No.7 二叉树通关攻略

二叉树种类:满二叉树,完全二叉树,二叉搜索树(BST,左小右大),平衡二叉树(AVL),红黑树(了解即可)必做题:144,94,145,102,104,101,226,98,112,236全部独立AC。深度优先搜索(DFS):前序遍历,中序遍历,后序遍历。3.能独立分析不同遍历方式的时间/空间复杂度(均为O(n))。看到递归题,能快速定义出递归函数的含义(返回值,递归关系)二叉树结构:根节点,子节点,叶节点,深度,高度。看到遍历题,能快速写出递归和非递归写法。看到BST题,能想到中序遍历和大小关系。

2301_79615277的博客 931

2023携程春招技术岗笔试复盘:考点剖析与备战指南

在互联网大厂校招中,技术岗笔试通常以计算机基础、算法与编程能力为核心筛选维度。从Java集合与JVM内存管理,到数据结构中的二叉树遍历与排序算法,再到计算机网络TCP状态、操作系统死锁及数据库索引,这些知识点共同构成了笔试的考查基石。扎实的基础不仅决定选择题得分率,更直接影响编程题中贪心、动态规划等算法的快速建模能力。理解各模块原理与工程实践价值,有助于在有限时间内高效分配答题节奏。本文以2023携程春招技术岗通用批笔试为样本,梳理试卷结构、高频考点、编程题破题思路与时间管理策略,为备战大厂春招笔试的同学提

weixin_33863087的博客 723

C++二叉树递归求解:LeetCode刷题核心框架与高频题型解析

递归是计算机科学中解决自相似结构问题的核心思想,其本质是将复杂问题分解为相似的子问题,通过函数自我调用来实现。在数据结构领域,二叉树因其递归定义(每个节点最多有两个子节点,且子树也是二叉树)而成为递归思想的天然应用场景。递归在二叉树遍历、搜索和计算中展现出极高的技术价值,它能将复杂的迭代逻辑简化为清晰的分治策略,是算法面试和工程实践中处理树形数据的必备技能。在应用层面,递归广泛用于文件系统遍历、DOM树操作、决策树模型以及各类算法竞赛题目。本文聚焦于使用C++语言,通过递归三部曲思维模型,系统解析二叉树深度

weixin_34167819的博客 307

别再让地图加载慢吞吞!GeoServer + GeoWebCache 缓存配置实战(附性能对比)

本文详细介绍了如何通过GeoServer和GeoWebCache优化地图服务性能,实现地图加载速度的显著提升。从缓存机制解析到实战配置流程,再到高级性能调优技巧,帮助开发者构建高效地图缓存系统,解决地图加载慢的问题。

weixin_42525369的博客 405

从触觉到视觉:GelSight传感器的工作原理与实战应用指南

本文深入解析了GelSight光学触觉传感器的核心工作原理,它通过将物理接触转化为视觉图像,为机器人提供了高精度的触觉感知。文章详细介绍了其在工业微观缺陷检测、机器人灵巧操作等领域的实战应用,并提供了从系统搭建到算法开发的完整指南,帮助工程师将这一前沿技术落地于实际项目。

solidity8miner的博客 937

2016百度研发笔试题复盘:字符串模拟、TopK、LCA、编辑距离一网打尽

在算法工程师的笔试与面试中,字符串模拟、堆排序、二叉树递归与动态规划始终是最高频的考察维度。这些基础数据结构与算法不仅是解决海量数据处理、文本匹配、树形结构查询等实际工程问题的核心工具,更是衡量候选人逻辑缜密性与代码实现能力的关键标尺。例如,通过堆可以在实时数据流中高效维护前K大元素,而递归思想则能优雅地解决二叉树中最近公共祖先的查询;编辑距离问题则借助状态转移方程将复杂字符串变换简化为子问题的递推求解。理解这些概念的底层原理与边界条件,能够在算法实战中快速定位最优解。以2016年百度研发工程师笔试题第四套

weixin_34268310的博客 439

WIFI CSI动作识别数据集全解析:从数据采集到深度学习应用

本文全面解析了利用商用Wi-Fi设备的信道状态信息进行动作识别的完整流程。文章以经典WiSA数据集为例,深入剖析了CSI数据的采集原理、结构特点,并详细阐述了从原始数据预处理、特征工程到深度学习模型(如CNN-LSTM融合架构)构建与优化的关键技术,旨在为研究者提供从数据到应用的全链路实战指南。

r2s3t4的博客 281

二叉树高频面试题解析与实战技巧

二叉树作为基础数据结构,在算法面试中占据重要地位。其核心价值在于能同时考察递归思维、边界处理与空间复杂度分析能力。通过层序遍历、深度计算等经典问题,可以深入理解DFS/BFS遍历原理。在工程实践中,二叉搜索树的验证、路径和优化等场景都需要注意全局性质判断与后序遍历技巧。本文结合LeetCode高频真题,详解迭代实现中的队列操作陷阱、递归分治策略的索引优化,以及最近公共祖先问题的多种解法对比,帮助开发者掌握二叉树问题的系统解题方法。

401

Blazor Session设置

微软官方封装了一些浏览器的操作,其中就有Session的操作的封装ProtectedSessionStorage 微软文档因为我们知道,依赖注入的生命周期是Singleton程序Scoped网页:刷新,url直接跳转都会重置。Transient路由C# Blazor 学习笔记(10):依赖注入但是没有一个和浏览器绑定的生命周期。即浏览器关闭才会退出。这个是后端无法获取的,因为后端根本不知道浏览器何时关闭。这个只能用浏览器自带的缓存。

qq_44695769的博客 1785

大数据开发工程师必备面试题与解答

大数据开发岗位一直是互联网行业的热门方向,面试过程中既考察基础知识,也关注实际项目经验和问题解决能力。本文整理了等核心组件相关的高频面试题及参考解答,帮助大家高效准备面试。大数据面试不仅考察基础理论,更看重项目经验与问题解决能力。本文涵盖了等核心知识点及调优思路,希望能帮助你在面试中游刃有余。

X2829352498的博客 302

leetcode HOT100总结

本人菜鸡一枚,历时两个月时间把HOT100题做完(Ctrl C-V)了,做完之后还是感觉到很虚,很多中等题还是不会做,于是乎花几天时间把这100题给总结一下。一方面,对自己的知识梳理;另一方面,便于后续回顾。(完成度99,是因为有一道题目收费,没有做!哈哈哈!)以下所有题目都是用Python3实现的。 下面是对这些题目按照算法进行分类整体,主要包括排序、哈希表、递归\回溯、链表、双指针、动态规划、二分查找、贪心、树、深度优先搜索、广度优先搜索等。 在整理之前,先学习一下Python的基本数据类型有哪些,请

qq_36561737的博客 4741

OpenClaw插件开发指南:扩展AI智能体的无限可能

OpenClaw插件开发指南介绍了如何扩展AI智能体的功能。该插件系统支持多种类型(功能、集成、工具、界面、工作流插件),具有模块化、低耦合等优势。开发环境需要安装SDK和工具包,通过plugin.json配置插件信息,主文件实现核心功能。API提供智能体管理、任务执行等接口,示例演示了文本处理插件的创建流程。开发者可基于此框架灵活扩展OpenClaw的能力。

一键难忘的博客 559

秋招算法面试突围:从知识体系到实战表达的全方位备战指南

数据结构与算法是计算机科学的核心基础,其本质是通过高效的数据组织和计算策略解决复杂问题。理解其原理,如动态规划的重叠子问题与最优子结构、递归的分治思想,是构建扎实知识体系的关键。掌握这些基础概念的技术价值在于,它们能显著提升问题抽象与解决能力,是开发高性能系统、处理海量数据(如哈希分治、位图法)的基石。在应用场景上,无论是后端开发中的高并发设计、系统架构中的缓存策略,还是算法岗中的模型优化,都离不开对核心算法思想的深刻理解与灵活运用。本文聚焦秋招算法面试,系统梳理了从知识体系构建、解题思维训练到编码实战与面

weixin_34221073的博客 384

深度学习实战103-基于KDD Cup 99数据集的搭建神经网络的检测系统(NIDS),通过对网络流量数据进行分析,提供完整代码

接下来,我们定义一个全连接神经网络模型。return x# 创建数据集和数据加载器# 初始化模型通过以上步骤,我们实现了一个基于PyTorch的简单网络入侵检测系统。这个系统使用KDD Cup 99数据集进行训练和评估。实际应用中,您可以根据需求调整模型结构、超参数以及数据预处理方法。希望对大家有所帮助!如果有任何问题或需要进一步的解释,请随时咨询。

微学AI的博客 1582

信息传输仿真:卫星通信系统仿真_(12).卫星通信系统仿真软件介绍

卫星通信系统仿真软件是进行卫星通信系统设计和性能优化的重要工具。通过这些软件,用户可以模拟和分析各种通信场景,验证不同的通信协议和算法,优化系统参数和配置。本节介绍了 MATLAB Simulink、NS-3、OPNET 和 SystemVue 的基本功能、特点和配置方法,希望对读者在选择和使用仿真软件时提供参考。在实际应用中,建议根据项目需求和团队能力,综合考虑选择合适的仿真软件。

2401_87715305的博客 1276

每周技术面试高频题汇总:大厂面试官到底在考什么?完整实战指南

大家好,又到了每周的面试复盘时间。。现在的面试官更喜欢把你扔进一个具体的“场景”里,看你怎么思考、怎么权衡(Trade-off)。基于过去一周 优快云、掘金、LeetCode 等社区的热议内容,我为大家精选了,涵盖算法、系统设计、数据库和网络四大领域。咱们不整那些虚的,直接上干货,看看这些题目背后的考察点和解题思路。

热爱技术与前沿创新,深耕科技领域,在科创中精进自我;探索技术乐趣,分享技术干货与成长心得,以技术为伴,热爱生活,在科创与生活中双向成长。 481

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Prepare50

遍历一次,建一个value为dict,key为下标的dict,每次去里面判断下,要找的数是否存在,时间复杂度O(n),空间负责度O(n)。

liuhe2296044的博客 940

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等) 题目描述: 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串: - s = s1 + s2 + ... + sn - t = t1 + t2 + ... + tm - |n - m| <= 1 - 交错 是 s1 + t

huayimenghan的博客 196

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

LeetCode 每日一题 2026/11/2-2026/11/8

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步

AlphaTao的博客 164

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 350

LeetCode Hot 100 链表专题 三· 3 题(Java)

收录题目:2. 两数相加、19. 删除链表的倒数第 N 个结点、24. 两两交换链表中的节点。 统一结构:① 题目分析与解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结。 贯穿三题的两条主线:虚拟头结点 dummy(统一处理头结点被修改的场景)与 指针修改顺序(避免断链、丢引用)。

2401_88612756的博客 480

LeetCode 1861. 旋转盒子|Go 双指针解法

j >= 0,如果写成j>0,会漏掉第 0 列,最左侧石头处理失败旋转矩阵行列互换:原 m 行 n 列 → 结果 n 行 m 列,make 数组长度不要写反旋转公式m-1-i:是原总行数 m,不是 n!很容易写成n-1-i区分:本题和轮转数组(189)分组循环不一样!189:所有元素固定移动 k 步,需要 gcd 分组1861:障碍物分割成多个独立段,石头向段末尾挤,用双指针更合适。

2503_92676540的博客 174

Hash表:两数之和、字母异位词分组、最长连续序列 [力扣 Hot100]

三道高频哈希表应用题:两数之和(利用HashMap快速查找补数)、字母异位词分组(排序后作为键分组)、最长连续序列(通过HashSet去重并仅从序列起点扩展)。核心思想均为借助哈希结构优化查找效率,避免重复计算。同时提及双指针等其他解法思路,体现算法设计中“空间换时间”的典型策略。

2403_87560480的博客 52

LeetCode 3926. 统计有效单词的出现次数【分组循环】

核心思想:用分组循环,一趟遍历字符串,把一个个单词切出来,丢进哈希表统计频次。,先把所有片段拼接成完整文本字符串。,依次返回每个单词在文本里的出现次数。难点:内层循环的判断条件,区分。

2503_92676540的博客 164

力扣第526场周赛心得理解

思路:因为题目要求尽可能求出最小的最大值,而满足要求最小公约数为2,作为题目要求最小的最大值,先去求出它的最大公约数再通过value判断最左边是否大于0,以及value本身是否大于0,而index的位置只能为中间或者最右边,所以最后输出只能是value本身或者在这个基础上加相隔相应距离次数的结果。两个整数,是指将第二个整数的所有十进制数位拼接在第一个整数的所有十进制数位之后。如果不存在这样的数组,返回 -1。4097. 合并整数后的最小值。返回所有合并后得到的整数中的。合并,依此类推,直到将。

目前主攻编程,目标是把屏幕上的红波浪线变成流畅运行的程序♪(^∀^●)ノシ 197
上一篇: 【LeetCode: 236. 二叉树的最近公共祖先 + 二叉树 + 递归】
下一篇: 【LeetCode: SQL专题 : SQL132 每个题目和每份试卷被作答的人数和次数 + 合并查询】
硕风和炜
硕风和炜 优质创作者: Java技术领域 优质创作者: Java技术领域
博客等级 码龄7年 2万+粉丝 1024原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硕风和炜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值