Java找二叉树的公共祖先
描述:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”


方法一:
思路:情况一p或者q其中一个是root,直接返回root;情况二,p或者q分别在root的左右子树上,递归找到root,情况三,p和q都在左子树或右子树上,这样有可能是递归后得到的情况一,或者是递归后的情况二
//给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。前提:q!=p
//https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/description/
//思路:情况一p或者q其中一个是root,直接返回root;情况二,p或者q分别在root的左右子树上,递归找到root,
//情况三,p和q都在左子树或右子树上,这样有可能是递归后得到的情况一,或者是递归后的情况二
//csdn:
public class Test4 {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(p==root || q==root)return root;//情况一和情况二if (root==null)return null;TreeNode rootleft=lowestCommonAncestor(root.left,p,q);TreeNode rootright=lowestCommonAncestor(root.right,p,q);//情况三if(rootleft!=null && rootright!=null)return root;//情况三下的情况二//p和q都在左子树或右子树上,else if(rootleft!=null && rootright==null)return rootleft;else if(rootleft==null && rootright!=null)return rootright;return null;//没有找到}}
方法二
思路:我们用两个栈分别存储root到p和q经过的节点路径,当递归到某个节点时,这个节点的左右子树都没有p或者q,说明该节点不是路径上的节点,出栈,两个栈存储完毕后保证两个栈的大小长度一样,一块出栈,当出栈元素相同时就是交点
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root==null)return null;Stack<TreeNode> stack_q=new Stack<>();Stack<TreeNode>stack_p=new Stack<>();getStack(root,stack_p,p);//寻找从根节点到p节点路径getStack(root,stack_q,q);//寻找从根节点到q节点路径int size_p=stack_p.size();int size_q=stack_q.size();//保证连个栈的长度一样if(size_p>size_q){for (int i = 0; i < size_p-size_q; i++) {stack_p.pop();}} else if (size_p<size_q) {for (int i = 0; i < size_q - size_p; i++) {stack_q.pop();}}//一块出一个元素,当元素相同时就是交点while (stack_p!=null){if(stack_p.peek()==stack_q.peek())return stack_p.pop();else {stack_p.pop();stack_q.pop();}}return root;}public boolean getStack (TreeNode root,Stack<TreeNode> stack,TreeNode key){if(root==null)return false;stack.push(root);if(root==key)return true;boolean figleft=getStack(root.left,stack,key);if(figleft)return true;//左边找到了节点boolean figright=getStack(root.right,stack,key);if (figright)return true;//右边找到了节点stack.pop();//该节点的左右子树都没有寻找的节点,从栈上,或者路径上移除return false;}相关文章:
Java找二叉树的公共祖先
描述: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节…...
《Linux高性能服务器编程》笔记03
Linux高性能服务器编程 本文是读书笔记,如有侵权,请联系删除。 参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 文章目录 Linux高性能服务器编程第07章 Linux服务器程序规范7.1日志7.2用…...
Java毕业设计-基于ssm的网上求职招聘管理系统-第85期
获取源码资料,请移步从戎源码网:从戎源码网_专业的计算机毕业设计网站 项目介绍 基于ssm的网上求职招聘管理系统:前端 jsp、jquery,后端 springmvc、spring、mybatis,角色分为管理员、招聘人员、用户;集成…...
UDP和TCP
UDP协议是一种不可靠的、面向无连接的协议。在通信过程中,它并不像TCP那样需要先建立一个连接,只要(目的地址,端口号,源地址,端口号)确定了,就可以直接发送信息报文,并且…...
【C++】vector容器接口要点的补充
接口缩容 在VS编译器的模式下,类似于erase和insert接口的函数通常会进行缩容,因此,insert和erase行参中的迭代器可能会失效。下图中以erase为例: 代码如下: #include <iostream> #include <vector> #inclu…...
electron-vite中的ipc通信
1. 概述 再electron中,进程间的通信通过ipcMain和ipcRenderer模块,这些通道是任意和双向的 1.1. 什么是上下文隔离进程 ipc通道是通过预加载脚本绑定到window对象的electron对象属性上的 2. 通信方式 2.1. ipcMain(也就是渲染进程向主进…...
探秘网络爬虫的基本原理与实例应用
1. 基本原理 网络爬虫是一种用于自动化获取互联网信息的程序,其基本原理包括URL获取、HTTP请求、HTML解析、数据提取和数据存储等步骤。 URL获取: 确定需要访问的目标网页,通过人工指定、站点地图或之前的抓取结果获取URL。 HTTP请求&#…...
音视频编解码学习记录
目录 学习资料个人git仓库 文章 学习资料 个人git仓库 标准,资料,笔记: https://gitee.com/fedorayang/video_and_audio_codec.git 文章 理解低延迟视频编码的正确姿势: https://cloud.tencent.com/developer/article/1358721...
零基础小白刚刚入门Python的注意点总结~
文章目录 一、注意你的Python版本1.print()函数2.raw_input()与input()3.比较符号,使用!替换<>4.repr函数5.exec()函数 二、新手常遇到的问题1、如何写多行程序?2、如何执行.py文件?3、and,or,not4、True和False…...
从 Context 看 Go 设计模式:接口、封装和并发控制
文章目录 Context 的基本结构Context 的实现和传递机制为什么 Context 不直接传递指针案例:DataStore结论 在 Go 语言中, context 包是并发编程的核心,用于传递取消信号和请求范围的值。但其传值机制,特别是为什么不通过指针传递…...
微信小程序字体大小
微信小程序中可以使用以下CSS样式来设置字体大小: font-size: 12px; // 设置字体大小为12像素在小程序中,可以直接在WXML文件和WXSS文件中使用这个样式。...
L1-062 幸运彩票(Java)
彩票的号码有 6 位数字,若一张彩票的前 3 位上的数之和等于后 3 位上的数之和,则称这张彩票是幸运的。本题就请你判断给定的彩票是不是幸运的。 输入格式: 输入在第一行中给出一个正整数 N(≤ 100)。随后 N 行&#…...
【计算机网络】2、传输介质、通信方向、通信方式、交换方式、IP地址表示、子网划分
文章目录 传输介质双绞线无屏蔽双绞线UTP屏蔽双绞线STP 网线光纤多模光纤MMF单模光纤SMF 无线信道无线电波红外光波 通信方向单工半双工全双工 通信方式异步传输同步传输串行传输并行传输 交换方式电路交换报文交换分组交换 IP地址表示IP地址的定义IP地址的分类无分类编址特殊I…...
【Linux 内核源码分析】堆内存管理
堆 堆是一种动态分配内存的数据结构,用于存储和管理动态分配的对象。它是一块连续的内存空间,用于存储程序运行时动态申请的内存。 堆可以被看作是一个由各个内存块组成的堆栈,其中每个内存块都有一个地址指针,指向下一个内存块…...
Qt 5.15.2 (MSVC 2019)编译 QWT 6.2.0 : 编译MingW或MSVC遇到的坑
MingW下编译QWt 6.2.0 下载qwt最新版本,用git工具 git clone下载源码 git clone https://git.code.sf.net/p/qwt/git qwt-git 或者使用我下载的 qwt 2.6.0 链接:https://pan.baidu.com/s/1KZI-L10N90TJobeqqPYBqw?pwdpq1o 提取码:pq1o 下载…...
模具制造企业ERP系统有哪些?企业怎么选型适配的软件
模具的生产管理过程比较繁琐,涵盖接单报价、车间排期、班组负荷评估、库存盘点、材料采购、供应商选择、工艺流转、品质检验等诸多环节。 有些采用传统管理手段的模具制造企业存在各业务数据传递不畅、信息滞后、不能及时掌握订单和车间生产情况,难以对…...
管理信息系统知识点复习
目录 一、名词解释题1.企业资源规划(ERP)2.面向对象方法:3.电子健康:4.供应链5.数据挖掘6.“自上而下”的开发策略:7.业务流程重组8.面向对象:9.决策支持系统10.聚类11.集成开发环境:12.供应商协同13.数据仓库14.深度学…...
【Bug】.net6 cap总线+rabbitmq延时消息收不到
文章目录 问题问题代码原因解决处理Bug的具体步骤 问题 我有两个服务一个叫05一个叫15 然后用的cap总线rabbitmq 05消息队列发了一条延时消息,到时间了05服务的订阅者能收到 15服务订阅同一个消息的没收到(cap的cashboard)(手动requeue05和15都能收到&a…...
在 Python 中检查一个数字是否是同构数
更多资料获取 📚 个人网站:ipengtao.com 同构数,又称为自守数或自同构数,是一类特殊的数字,它们具有一种有趣的性质:将其平方后的数字,可以通过某种方式重新排列得到原来的数字。本文将详细介绍…...
【 Qt 快速上手】-①- Qt 背景介绍与发展前景
文章目录 1.1 什么是 Qt1.2 Qt 的发展史1.3 Qt 支持的平台1.4 Qt 版本1.5 Qt 的优点1.6 Qt的应用场景1.7 Qt的成功案例1.8 Qt的发展前景及就业分析行业发展方向就业方面的发展前景 1.1 什么是 Qt Qt 是一个跨平台的 C 图形用户界面应用程序框架。它为应用程序开发者提供了建立…...
Perplexity语言学习资源深度测评(2024Q2最新版):92%的学习者不知道的5个隐藏功能与3倍提效配置
更多请点击: https://intelliparadigm.com 第一章:Perplexity语言学习资源概览与核心价值定位 Perplexity 作为一款以“实时、可溯源、推理驱动”为设计哲学的AI问答工具,正迅速成为语言学习者构建语境化知识体系的关键基础设施。它并非传统…...
从COCO到自定义:用Labelme为YOLOv8-Pose制作关键点数据集的完整避坑指南
从COCO到自定义:用Labelme为YOLOv8-Pose制作关键点数据集的完整避坑指南 在计算机视觉领域,关键点检测技术正逐渐成为工业界和学术界的热点研究方向。不同于传统的目标检测任务,关键点检测不仅需要定位物体位置,还要精确识别物体内…...
TPU核心引擎的‘血管网络’:用Python建模与可视化理解脉动阵列数据流
TPU核心引擎的‘血管网络’:用Python建模与可视化理解脉动阵列数据流 在AI加速器的世界里,TPU(张量处理单元)的脉动阵列就像一台精密的机械钟表,每个齿轮的咬合都遵循着严格的时序规律。但与硬件工程师通过RTL语言&qu…...
W5500 TCP客户端开发避坑指南:从寄存器配置到稳定通信的5个关键步骤
W5500 TCP客户端开发避坑指南:从寄存器配置到稳定通信的5个关键步骤 在嵌入式网络通信领域,W5500作为一款硬件集成TCP/IP协议栈的以太网控制器,因其易用性和稳定性备受开发者青睐。然而,当项目从实验室demo转向实际部署时…...
告别黑框!树莓派4B远程桌面完整指南:从VNC配置到RealVNC/XRDP方案选择与优化
树莓派4B远程桌面终极方案:告别黑框与卡顿的实战指南 对于许多树莓派开发者而言,那个令人沮丧的黑色方框已经成为远程连接体验的代名词。当你满怀期待地输入IP地址,等待的却是一个无法操作的空白界面,这种挫败感足以让任何人抓狂。…...
在Taotoken平台观测不同模型API调用的延迟与用量数据实践
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在Taotoken平台观测不同模型API调用的延迟与用量数据实践 当你在一个项目中集成了多个大模型,并希望通过Taotoken的统一…...
不只是格式化:深入理解Mac磁盘工具里的‘分区方案’(GUID/MBR/APM),选对才能跨平台读写
不只是格式化:深入理解Mac磁盘工具里的‘分区方案’(GUID/MBR/APM),选对才能跨平台读写 当你将一块移动硬盘从APFS格式化为ExFAT后,满心欢喜地插到Windows电脑上,却依然收到"需要格式化"的提示—…...
基于Orange Pi 5 Plus与DEEPX栈的边缘AI部署实战指南
1. 项目概述:当一块开发板遇见AI大潮最近在深圳参加了一场关于人工智能硬件与边缘计算的行业峰会,感触颇深。会上,一款基于Orange Pi 5 Plus开发板打造的DEEPX人工智能产品,实实在在地吸引了我的目光。这不仅仅是又一款“开发板AI…...
用NE555和立创EDA做个会‘叮咚’的门铃:从原理图到PCB打板的完整DIY记录
从零打造NE555叮咚门铃:立创EDA全流程实战指南 当电子爱好者第一次尝试将电路图转化为实物时,往往会面临软件操作、元件选型和生产对接的多重挑战。本文将以经典NE555叮咚门铃为例,手把手演示如何用立创EDA完成从原理图设计到PCB打板的完整流…...
5分钟快速上手APK Installer:Windows电脑安装Android应用的终极指南
5分钟快速上手APK Installer:Windows电脑安装Android应用的终极指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想在Windows电脑上直接运行Android应用…...
