【LeetCode经典题解】搞定二叉树最近公共祖先:递归法+栈存路径法,附代码实现

【LeetCode经典题解】搞定二叉树最近公共祖先:递归法+栈存路径法,附代码实现
在这里插入图片描述
🎁个人主页:User_芊芊君子
🎉欢迎大家点赞👍评论📝收藏⭐文章
🔍系列专栏:Java.数据结构
在这里插入图片描述


在这里插入图片描述


【前言】

二叉树的最近公共祖先是数据结构中的经典问题,无论是算法面试还是实际开发都高频出现。本文将从问题本身出发,拆解递归法与栈存路径法两种核心思路的逻辑步骤,并附上完整代码实现,帮你快速掌握这一考点。

文章目录:

一、二叉树的最近共同祖先

在这里插入图片描述

二、思路分析

方法一:递归法

判空

  • 如果根节点为空,直接返回null
  • 如果当前节点是p或者q,那么这个节点就是最近公共祖先

递归

  • 分别遍历当前节点的左子树和右子树,找到p和q的最近公共祖先,存于TreeNode leftRet或者TreeNode rightRet

结果

  • 如果左右子树都找到,那么当前节点就是p和q的最近公共祖先
  • 如果左子树找到,那就返回左子树的结果;

如果右子树找到,那就返回右子树的结果;

在这里插入图片描述

方法二:栈存路径法

获取路径

通过深度优先搜索,分别找到从根节点到p和q的路径中所有节点,并分别存入两个栈中

对齐栈长度

比较两个栈中元素长度,将较长的栈中元素弹出,然后比较两个栈中的下一深度元素是否相等

找公共祖先

同时弹出两个栈中不相等的栈顶元素,第一个相同的节点就是最近公共祖先

在这里插入图片描述

三、代码展示

方法一:递归法

publicTreeNodelowestCommonAncestor(TreeNode root,TreeNode p,TreeNode q){//当前节点为空,直接返回nullif(root ==null){returnnull;}//当前节点是p或者q,返回当前节点(祖先)if(root == p || root == q){return root;}//递归探索左子树,找到p和q的最近祖先TreeNode leftRet =lowestCommonAncestor(root.left, p, q);//递归探索右子树,找到p和q的最近祖先TreeNode rightRet =lowestCommonAncestor(root.right, p, q);//左子树和右子树都找到if(leftRet !=null&& rightRet !=null){return root;//左子树找到}elseif(leftRet !=null){return leftRet;}else{//右子树找到return rightRet;}}

方法二:栈存路径法

publicbooleangetPath(TreeNode root,TreeNode node,Stack<TreeNode> stack){if(root ==null){returnfalse;}//将当前节点压入路径 stack.push(root);//找到目标节点if(root == node){returntrue;}//递归搜索左子树boolean flg =getPath(root.left,node,stack);if(flg){returntrue;}//递归搜索右子树 flg =getPath(root.right,node,stack);if(flg){returntrue;}//左右子树都没找到,弹出当前节点 stack.pop();returnfalse;}publicTreeNodelowestCommonAncestor(TreeNode root,TreeNode p,TreeNode q){if(root ==null){returnnull;}//找到跟到p和q的路径Stack<TreeNode> stackp =newStack<>();Stack<TreeNode> stackq =newStack<>();getPath(root,p,stackp);getPath(root,q,stackq);//对齐两个栈长度int sizep = stackp.size();int sizeq = stackq.size();int size = sizep-sizeq;if(size>0){//stacp更长,弹出多余元素while(size !=0){ stackp.pop(); size--;}}else{////stacq更长,弹出多余元素 size = sizeq-sizep;while(size !=0){ stackq.pop(); size--;}}//此时两个栈大小一样,//同时弹出栈顶,找到相同的while(!stackp.isEmpty()&&!stackq.isEmpty()){if(stackp.peek().equals(stackq.peek())){return stackp.peek();} stackp.pop(); stackq.pop();}returnnull;}

四、总结

通过递归法的“自底向上”回溯,以及栈存路径法的“路径对比”思路,我们可以高效求解二叉树的最近公共祖先问题——前者利用递归特性简化代码,后者通过显式路径存储更直观易懂。结合本文的思路分析与代码示例,你可以根据场景灵活选择解法,轻松应对这类二叉树算法题。

Read more

Qwen3-VL-WEBUI技术整合:与RAG系统协同工作教程

Qwen3-VL-WEBUI技术整合:与RAG系统协同工作教程 1. 引言 随着多模态大模型的快速发展,视觉-语言理解能力已成为AI应用落地的关键一环。阿里云推出的 Qwen3-VL 系列模型,作为迄今为止Qwen系列中最强大的视觉-语言模型(Vision-Language Model, VLM),在文本生成、图像理解、视频分析和代理交互等方面实现了全面升级。 本文将聚焦于开源项目 Qwen3-VL-WEBUI ——一个专为Qwen3-VL设计的本地化Web交互界面,并深入讲解如何将其与 RAG(Retrieval-Augmented Generation)系统 进行深度整合,构建具备“看图说话+知识检索+智能推理”三位一体能力的下一代AI应用。 该WEBUI内置了 Qwen3-VL-4B-Instruct 模型,支持图像上传、对话交互、工具调用等核心功能,开箱即用,适合快速原型开发与工程集成。 通过本教程,你将掌握: - 如何部署并运行 Qwen3-VL-WEBUI - RAG系统的基本架构与选型建议 - 实现图文混合输入下的动态知识增强机制 - 构建可扩展的多模态问答系

By Ne0inhk
Python Web 开发进阶实战:AI 原生安全防护 —— 在 Flask + Suricata 中构建智能网络威胁狩猎平台

Python Web 开发进阶实战:AI 原生安全防护 —— 在 Flask + Suricata 中构建智能网络威胁狩猎平台

第一章:从规则防御到行为智能 1.1 传统安全的局限 技术缺陷 签名检测(Snort/Suricata) | 仅能识别已知攻击模式防火墙 ACL | 无法阻止合法端口上的恶意流量SIEM 告警 | 海量日志 → 分析瘫痪 1.2 AI 安全的优势 * 无监督学习:无需标注攻击样本 * 上下文感知:结合用户角色、历史行为 * 预测性:在破坏发生前预警 案例:某企业通过 DNS 请求熵值异常,提前 14 天发现 Cobalt Strike C2。 第二章:平台架构设计 2.1 数据流全景 [网络流量] │ ├── [Suricata] → 实时 IDS 告警(JSON) ├── [Zeek] → 连接日志(conn.

By Ne0inhk
突破亚马逊壁垒,Web Unlocker API 助您轻松获取数据

突破亚马逊壁垒,Web Unlocker API 助您轻松获取数据

目录 * 一、Web Unlocker API简介 * 二、开始使用Web Unlocker API * 1、首先进入控制台页面,点击左侧第一个tab键“代理 & 抓取基础设施”,找到“网页解锁器”,开始使用。 * 2、进入网页解锁器页面后,填写通道名称,添加简短描述,点击添加 * 3、直接展示代理基础设施/web_unlocker3的详细信息 * 4、配置网页解锁器 * 5、以Python脚本获取亚马逊平台数据为示例 * 6、结果示例 * 三、Web Scraper * 1、快速使用Web Scraper * 2、通过python获取亚马逊网页数据 * 3、定位具体数据 * 4、运行并保存到csv文件 * 四、SERP API * 五、优惠升级

By Ne0inhk

Clawdbot+Qwen3-32B保姆级教程:从环境准备到Web Chat可用的完整链路

Clawdbot+Qwen3-32B保姆级教程:从环境准备到Web Chat可用的完整链路 1. 为什么需要这个组合:一句话说清价值 你是不是也遇到过这些问题:想本地跑一个真正能用的大模型,但Qwen3-32B这种大块头动辄需要2×A100显卡,部署门槛高;想快速搭个聊天界面,又不想从零写前端、配后端、接API;好不容易调通了Ollama,却发现网页访问不了,跨域报错、端口不通、代理转发一头雾水? Clawdbot+Qwen3-32B这套组合,就是为解决这些“卡脖子”环节而生的——它不碰CUDA编译、不改模型权重、不手写WebSocket服务,而是用极简配置把私有大模型能力,稳稳地托举到浏览器里。你只需要一台带NVIDIA GPU的机器(RTX 4090/3090/A6000均可),15分钟内就能拥有一个专属、离线、可对话的AI聊天页。 这不是概念演示,也不是Demo玩具。它已经稳定运行在多个内部知识助手、技术文档问答和代码辅助场景中,支持连续多轮对话、上下文记忆、流式输出,且全程不依赖任何公网API。 下面我们就从零开始,一步步带你走通这条“

By Ne0inhk