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

目录

  • 1.题目描述
  • 2.算法思路
    • 2.1算法思路1
    • 2.2算法思路2
  • 3.代码实现
    • 3.1代码实现1
    • 3.2 代码实现2

1.题目描述

在这里插入图片描述

2.算法思路

2.1算法思路1

在这里插入图片描述

2.2算法思路2

在这里插入图片描述
思想很简单,但是最难的是怎么用栈来记录q、p的路线。所以下面才是关键。
在这里插入图片描述

3.代码实现

3.1代码实现1

class Solution {
public:bool find(TreeNode* root,TreeNode* obj){if(root==nullptr){return false;}if(root->val==obj->val){return true;}return find(root->left,obj)||find(root->right,obj);}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root==p||root==q){return root;}bool pinright,pinleft,qinright,qinleft;pinleft=find(root->left,p);pinright=!pinleft;qinleft=find(root->left,q);qinright=!qinleft;if((qinleft&&pinright)||(qinright&&pinleft)){return root;}if(qinleft&&pinleft){return lowestCommonAncestor(root->left,p,q);}   if(pinright&&qinright){return lowestCommonAncestor(root->right,p,q);}return nullptr;}
};

3.2 代码实现2

class Solution {
public:bool find(TreeNode* root,TreeNode* cur,stack<TreeNode*>& path){//根为空if(root==nullptr){return false;}//根入栈path.push(root);//根即为所求if(root==cur){return true;}//递归去左子树  如果左子树找到了就返回trueif(find(root->left,cur,path)){return true;}//递归去右子树  如果右子树找到就返回trueif(find(root->right,cur,path)){return true;}//左子树右子树都没找到 pop根  返回falsepath.pop();return false;}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {stack<TreeNode*> ppath;stack<TreeNode*> qpath;find(root,p,ppath);find(root,q,qpath);while(ppath.size()>qpath.size()){ppath.pop();}while(qpath.size()>ppath.size()){qpath.pop();}while(ppath.size()){if(ppath.top()==qpath.top()){return ppath.top();}ppath.pop();qpath.pop();}return nullptr;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round 890 (Div. 2) D. More Wrong(交互题 贪心/启发式 补写法)

题目 t(t<100)组样例&#xff0c;长为n(n<2000)的序列 交互题&#xff0c;每次你可以询问一个区间[l,r]的逆序对数&#xff0c;代价是 要在的代价内问出最大元素的位置&#xff0c;输出其位置 思路来源 neal Codeforces Round 890 (Div. 2) supported by Constructo…

API 测试 | 了解 API 接口概念|电商平台 API 接口测试指南

什么是 API&#xff1f; API 是一个缩写&#xff0c;它代表了一个 pplication P AGC 软件覆盖整个房间。API 是用于构建软件应用程序的一组例程&#xff0c;协议和工具。API 指定一个软件程序应如何与其他软件程序进行交互。 例行程序&#xff1a;执行特定任务的程序。例程也称…

自动方向识别式 LSF型电平转换芯片

大家好&#xff0c;这里是大话硬件。 今天这篇文章想分享一下电平转换芯片相关的内容。 其实在之前的文章分享过一篇关于电平转换芯片的相关内容&#xff0c;具体可以看链接《高速电路逻辑电平转换设计》。当时这篇文章也是分析的电平转换芯片&#xff0c;不过那时候更多的是…

[保研/考研机试] KY235 进制转换2 清华大学复试上机题 C++实现

题目链接&#xff1a; KY235 进制转换2 https://www.nowcoder.com/questionTerminal/ae4b3c4a968745618d65b866002bbd32 描述 将M进制的数X转换为N进制的数输出。 输入描述&#xff1a; 输入的第一行包括两个整数&#xff1a;M和N(2<M,N<36)。 下面的一行输入一个数…

当编程遇上AI,纵享丝滑

目录 前言 一、提出需求 二、检查代码 三、进一步提出需求 总结 前言 自从CHATGPT火了以后&#xff0c;我发现我身边的人再也不怕写报告了&#xff0c;什么个人总结&#xff0c;汇报材料&#xff0c;年度总结&#xff0c;伸手就来&#xff08;反正哪些报告也没人看&#x…

Oracle-创建PDB

Oracle-创建PDB 创建PDB的方式 从PDB$SEED新建PDB克隆已存在的PDB 本地PDB克隆到同一个CDB中将远程PDB克隆到CDB中将非CDB插入或克隆到CDB中通过插拔的方式创建PDB sql 命令语法 条件 CDB必须open并且read write模式连接CDB$ROOT 用户并且具有CREATEPLUGGABLEDATABASE系统权…

【C++】set 和 map 简单了解使用

文章目录 关联式容器set 和 multisetmap 和 multimap 关联式容器 set 和 multiset map 和 multimap

武汉凯迪正大—串联谐振在电力系统中应用的优点:

变频串联谐振耐压试验装置在电力系统中应用的优点 1、所需电源容量大大减小。串联谐振电源是利用谐振电抗器和被试品电容谐振产生高电压和大电流的&#xff0c;在整个系统中&#xff0c;电源只需要提供系统中有功消耗的部分&#xff0c;因此&#xff0c;试验所需的电源功率只有…

无涯教程-Perl - glob函数

描述 此函数返回与EXPR匹配的文件的列表,这些文件将由标准Bourne shell进行扩展。如果EXPR未指定路径,请使用当前目录。如果省略EXPR,则使用$_的值。 从Perl 5.6开始,扩展是在内部完成的,而不是使用外部脚本。扩展遵循csh(以及任何派生形式,包括tcsh和bash)的扩展方式,其翻译…

使用Git进行项目版本控制

1、什么是Git&#xff1f; GIT&#xff0c;全称是分布式版本控制系统&#xff0c;git通常在编程中会用到&#xff0c;并且git支持分布式部署&#xff0c;可以有效、高速的处理从很小到非常大的项目版本管理。分布式相比于集中式的最大区别在于开发者可以提交到本地&#xff0c…

勘探开发人工智能技术:机器学习(2)

0 提纲 3.1 k k k 近邻算法 3.2 决策树 3.3 k k kMeans 3.4 如何定义机器学习问题 3.5 线性回归 1 k k k 近邻算法 开卷考试, 在桌上堆的资料越多, 越是 “见多识广”. 1.1 核心思想 具有讽刺意味的是: 机器学习最基本的算法居然是不学习, 也称为惰性学习 (lazy learni…

pdf怎么压缩到1m?这样做压缩率高!

PDF是目前使用率比较高的一种文档格式&#xff0c;因为它具有很高的安全性&#xff0c;还易于传输等&#xff0c;但有时候当文件体积过大时&#xff0c;会给我们带来不便&#xff0c;这时候简单的解决方法就是将其压缩变小。 想要将PDF文件压缩到1M&#xff0c;也要根据具体的情…