二叉树的最近公共祖先(C++实现)
二叉树的最近公共祖先
- 题目
- 思路
- 代码(详细注释)
题目
二叉树的最近公共祖先

思路
我们可以通过两个栈来实现
实现一个FindPath函数,用来查找从根节点到目标节点的路径(路径可以用栈来保存)
路径保存好后,
再使用两个循环来比较栈Ppath和Qpath的大小,使得两个栈的大小相等。
然后,再使用一个循环来比较栈顶元素,直到找到最低公共祖先。在每一次比较过程中,如果栈顶元素不相等,就分别从两个栈中弹出栈顶元素,直到找到最低公共祖先。

操作如下:
-
在lowestCommonAncestor函数中,声明两个栈Ppath和Qpath,用于保存从根节点到节点p和q的路径。
-
调用FindPath函数两次,分别查找节点p和q的路径。FindPath函数是一个递归函数,用于在二叉树中查找节点x的路径,并将路径保存在给定的栈path中。
-
在FindPath函数中,首先判断当前节点root是否为空,如果为空,则返回false。然后,将当前节点root压入栈path中。
-
接着,判断当前节点root是否等于目标节点x,如果是,则返回true,表示已经找到目标节点。
-
如果目标节点不在当前节点root上,那么就递归地在左子树和右子树中查找目标节点。如果在左子树中找到目标节点,则返回true,表示已经找到目标节点。如果在右子树中找到目标节点,则同样返回true。
-
如果左子树和右子树都没有找到目标节点,则说明当前节点不在最终路径上,需要将其从栈path中弹出,并返回false。
-
回到lowestCommonAncestor函数,使用两个循环来比较栈Ppath和Qpath的大小,使得两个栈的大小相等。
-
然后,再使用一个循环来比较栈顶元素,直到找到最低公共祖先。在每一次比较过程中,如果栈顶元素不相等,就分别从两个栈中弹出栈顶元素,直到找到最低公共祖先。
-
最后,返回栈Qpath的栈顶元素,即为最低公共祖先节点。
代码(详细注释)
class Solution {
public:// 查找从根节点到目标节点的路径bool FindPath(TreeNode *root, TreeNode *x, stack<TreeNode*>& path) {if (root == nullptr) {return false; // 当前节点为空,返回false}path.push(root); // 将当前节点加入路径if (x == root) {return true; // 找到目标节点,返回true}if (FindPath(root->left, x, path)) {return true; // 在左子树中找到目标节点,返回true}if (FindPath(root->right, x, path)) {return true; // 在右子树中找到目标节点,返回true}path.pop(); // 当前节点不在路径上,弹出当前节点return false; // 返回false}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {stack<TreeNode*> Ppath; // 保存节点p的路径stack<TreeNode*> Qpath; // 保存节点q的路径FindPath(root, p, Ppath); // 查找节点p的路径FindPath(root, q, Qpath); // 查找节点q的路径// 使得两个路径的长度相等while (Ppath.size() != Qpath.size()) {if (Ppath.size() > Qpath.size()) {Ppath.pop(); // 如果Ppath路径长,弹出Ppath的栈顶元素} else {Qpath.pop(); // 如果Qpath路径长,弹出Qpath的栈顶元素}}// 逐个比较两个路径上的节点,找到最低公共祖先while (Ppath.top() != Qpath.top()) {Qpath.pop(); // 弹出Qpath栈顶元素Ppath.pop(); // 弹出Ppath栈顶元素}return Qpath.top(); // 返回最低公共祖先节点}
};
(本题完)
相关文章:
二叉树的最近公共祖先(C++实现)
二叉树的最近公共祖先 题目思路代码(详细注释) 题目 二叉树的最近公共祖先 思路 我们可以通过两个栈来实现 实现一个FindPath函数,用来查找从根节点到目标节点的路径(路径可以用栈来保存) 路径保存好后,…...
【conda】容易遗忘的命令使用总结
1. 在空conda虚拟环境中安装python 退出到base环境 conda activate base 执行命令 conda install -n 空环境名 python版本名 例如: conda install -n test python3.10 2. 无需确认直接创建环境 在末尾加上-y,例如: conda create -n tes…...
蓝桥杯第一天-----时间显示
文章目录 前言一、题目描述二、测试用例三、题目分析四、具体代码实现总结 前言 本章中将相信介绍蓝桥杯中关于时间显示的题目。 链接:https://www.lanqiao.cn/problems/1452/learning/ 一、题目描述 二、测试用例 三、题目分析 1.输入的时间为毫秒,毫…...
多文件夹图片预处理:清除空值、重置大小、分割训练集
→ 清理空值 防止出现cannot identify image file 参考Python数据清洗----删除读取失败图片__简单版_python用pil读取图片出错删除掉-CSDN博客 import os import shutil import warnings import cv2 import iofrom PIL import Image warnings.filterwarnings("error&qu…...
【Java】集合 之 使用 Map
为什么使用Map 我们知道,List是一种顺序列表,如果有一个存储学生Student实例的List,要在List中根据name查找某个指定的Student的分数,应该怎么办? 最简单的方法是遍历List并判断name是否相等,然后返回指定…...
第二证券:股票几点到几点开盘?
作为股民或许投资者,我们都知道股票是每天都有开盘和收盘时间的。但是,关于股票的开盘时间,很多人并不是很清楚,特别是初学者。在本文中,我们将从多个视点分析股票开盘时间,并为大家供给一些有用的信息。 …...
goweb入门教程
本文是作者自己学习goweb时写的笔记,分享给大家,希望能有些帮助 前言: 关于web:本质 web中最重要的就是浏览器和服务器的request(请求)和response(响应); 一个请求对应一个响应。 一个请求对应一个响应&…...
量子计算:探索未来的计算技术
量子计算:探索未来的计算技术 引言 在过去的几十年里,我们见证了计算机技术从简单的计算和存储发展到复杂的数据处理和人工智能的飞速进步。然而,随着我们进一步探索科技的前沿,传统的计算方法开始显示出其局限性。在这种情况下,量子计算——一种基于量子力学原理的新型计…...
HarmonyOS应用开发者基础认证考试题目及答案
一、判断题 Ability是系统调度应用的最小单元,是能够完成一个独立功能的组件。一个应用可以包含一个或多个Ability。 正确(True) 所有使用Component修饰的自定义组件都支持onPageShow,onBackPress和onPageHide生命周期函数。 错误(False) 每调用一次ro…...
c# 文件读取和写入
文件写入 using System.Collections.Generic; namespace demo1;/// <summary> /// System.IO下的所有的Stream类是所有数据流的基类 /// 流是用于传输数据的对象,流就是用来传输数据的 /// 数据传输的两种方式:1、数据从外部源传输到程序中&#…...
【MySQL库的操作】
目录: 前言库的操作创建数据库字符集和校验规则校验规则对数据库的影响 选择和查看数据库修改数据库删除数据库备份注意事项查看连接情况 总结 前言 剑指offer:一年又二天 库的操作 创建、选择、查看、修改、删除与备份。 创建数据库 CREATE DATABASE…...
rocketmq 集群环境部署及与spring cloud 集成
1 下载zip 安装包 rocketmq-all-5.1.4-bin-release.zip 2 修改启动配置,防止默认内存配置过高 runserver.sh/runbroker.sh/tools.sh 3 启动namesrv nohup sh bin/mqnamesrv >>namesrv.log & 4 启动brokerproxy 单点模式: nohup sh bin…...
SpringBoot——配置及原理
优质博文:IT-BLOG-CN 一、Spring Boot全局配置文件 application.properties与application.yml配置文件的作用:可以覆盖SpringBoot配置的默认值。 ◀ YML(is not a Markup Language:不仅仅是一个标记语言)࿱…...
fiddler抓包安卓
一、打断点 1、安卓手机和电脑在同一局域网下,手机连接的网络开启手动代理,ip填写电脑ip,端口填写fiddler中配置的端口。 ip查看: 端口配置:tools-options-connections 2、安装证书,手机浏览器输入电脑ip…...
Maven 进阶学习指南---setting详解
前言 当我们在开发项目时,有时需要用到外部依赖组件,例如当我们需要 Json 序列化的时候需要用到 FastJson 组件,我们可以通过下载对应 jar 包加载到项目中。但当一个大的项目同时需要依赖各种各样的外部服务,就存在着配置繁琐、依…...
人工智能与我们的生活
人工智能对我们的生活影响有多大 1. 人工智能的领域 人工智能涉及的领域广泛,包括但不限于: a. 医疗保健领域 人工智能在医疗诊断、药物研发、患者管理等方面发挥了重要作用。医疗影像分析、基因组学研究等都受益于人工智能技术,为医学领…...
前端将blob转换为可下载的url及下载
一.转换 //将blob转换为url const changeBlobToUrl blobData > {return new Promise(resolve > {//创建Blob对象const blob new Blob([blobData])// 创建FileReader对象const reader new FileReader()reader.onload function (e) {resolve(e.target.result)}// 使用F…...
LVS-DR实验
实验前准备 DR服务器:192.168.188.11 192.168.188.15 NFS服务器:192.168.188.14 Web服务器1:192.168.188.12 Web服务器2:192.168.188.13 Vip:192.168.188.188 客户端:192.168.188.200 配置负载均衡调度…...
MYSQL索引使用注意事项
索引使用注意事项: 1.索引列运算 不要在索引列上进行运算操作,否则索引将失效; 2.字符串不加引号 字符串类型使用时,不加引号,否则索引将失效; 3.模糊查询 如果仅仅是尾部模糊匹配,索引将不会失…...
深入理解Java中的String、StringBuilder和StringBuffer(每天一个技术点,第一天)
大家好,我是你们的博主每天一个技术点。今天,我们将探讨Java中的一个重要主题:String、StringBuilder和StringBuffer。这些类在Java编程中无处不在,但它们之间的区别和用法可能并不是所有人都清楚。所以,让我们深入了解…...
HKMG工艺的“阿喀琉斯之踵”:聊聊那个无法移除的SiON界面层与未来0.3nm的挑战
HKMG工艺的隐形枷锁:SiON界面层的物理宿命与亚纳米级突围战 在半导体工艺演进的史诗中,HKMG(高K金属栅)技术曾被寄予厚望——它用金属栅极替代传统多晶硅,搭配高K介质材料HfO₂,一举解决了栅极耗尽和漏电流…...
终极指南:如何用ESP32打造专业级蓝牙游戏手柄
终极指南:如何用ESP32打造专业级蓝牙游戏手柄 【免费下载链接】ESP32-BLE-Gamepad Bluetooth LE Gamepad library for the ESP32 项目地址: https://gitcode.com/gh_mirrors/es/ESP32-BLE-Gamepad 你是否曾经想过用ESP32开发板制作一个自定义的游戏控制器&am…...
告别EasyConnect兼容性烦恼:一份给Ubuntu/WSL2用户的终极配置备忘录
跨平台Linux环境下的EasyConnect深度配置指南在混合开发环境中,Linux用户经常面临企业级VPN工具兼容性挑战。EasyConnect作为国内广泛使用的内网接入解决方案,其在不同Linux发行版和子系统中的表现差异显著。本文将系统梳理物理机Ubuntu、WSL2以及虚拟机…...
Beyond Compare 5密钥生成终极指南:从RSA原理到实战激活
Beyond Compare 5密钥生成终极指南:从RSA原理到实战激活 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen Beyond Compare 5是一款功能强大的文件对比工具,但30天评估期后的…...
深度解析:ctfileGet如何实现城通网盘直链解析的3大技术突破
深度解析:ctfileGet如何实现城通网盘直链解析的3大技术突破 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet ctfileGet是一款专为城通网盘设计的开源直链解析工具,通过创新的技术…...
别再只搭环境了!用LangChain+ChromaDB在Mac上快速构建你的第一个私有知识库问答机器人
从零构建Mac上的智能知识管家:LangChainChromaDB实战指南 你是否厌倦了在成堆的文档中手动搜索信息?想象一下,只需简单提问,就能从你的笔记、报告或任何文本资料中获取精准答案。本文将带你用Mac电脑打造一个真正的私有知识库助手…...
中文分词与词频统计全流程实战 | 全网独家复现,Python零基础落地篇 引入jieba分词优化+多策略词频统计,助力文本挖掘、舆情分析、学术研究高效落地
目录 一、核心前言(明确价值,避开踩坑) 1.1 实战意义 1.2 技术选型说明 1.3 前置准备(零基础必看) 二、核心原理(极简理解,无需深入) 2.1 中文分词原理 2.2 词频统计原理 三、全流程代码实现(零基础可复制,全程注释) 3.1 工程化目录结构(必看,避免路径错…...
字节校招7000人转正率50%:大厂HR体系,正在“去经验化“
字节跳动刚刚用一组校招数据,扯下了大厂老兵最后一块遮羞布。 2026年春,ByteIntern规模狂飙至7000人,转正率史无前例地超过50%。 短短3到6个月,字节用远低于市场价的成本,批量生产出了3500个能够直接上岗的替代者。 同样的薪酬包,大厂宁愿招两个高潜应届生,也不愿意留…...
AssetRipper深度解析:Unity资源静态解析原理与工程化实践
1. 这不是“破解工具”,而是Unity开发者自己的资源归档方案AssetRipper这个名字,对很多刚接触Unity反编译的开发者来说,第一反应是“哦,那个能扒出美术资源的软件”。但如果你真这么用它,大概率会在三天内遇到贴图全黑…...
Unity Library文件夹不是缓存,而是项目运行时核心枢纽
1. Library文件夹不是“缓存”,而是Unity工程的“神经系统”在Unity项目里,只要有人提“工程太大”,十有八九会冒出一句:“删掉Library文件夹不就完了?”——这话我听过不下五十遍,从刚入行的实习生&#x…...
