236. 二叉树的最近公共祖先-优化

news2024/11/15 11:07:33

本期我们对该题进行优化,不知道题目的小伙伴建议先看看之前的

236. 二叉树的最近公共祖先_KLZUQ的博客-CSDN博客

我们要将时间复杂度优化为O(N)

class Solution {
public:
    bool FindPath(TreeNode* root, TreeNode* x,stack<TreeNode*>& path)
    {
        if(root==nullptr)
            return false;
        path.push(root);
        if(root==x)
            return true;
        if(FindPath(root->left,x,path))
            return true;
        if(FindPath(root->right,x,path))
            return true;
        path.pop();
        return false;
    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        stack<TreeNode*> pPath,qPath;
        FindPath(root,p,pPath);
        FindPath(root,q,qPath);
        while(pPath.size() > qPath.size())
        {
            pPath.pop();
        }
        while(pPath.size() < qPath.size())
        {
            qPath.pop();
        }
        while(pPath.top() != qPath.top())
        {
            pPath.pop();
            qPath.pop();
        }
        return pPath.top();
    }
};

思路:

我们那这个来举例,假设我们要找6和4的公共祖先

我们先看6,我们找一个栈,我们按照前序的顺序依次遍历,3不是,入栈,然后去3的左边,也就是5,5不是,继续入栈,然后去5的左边,是6,此时我们找到了,然后return true,返回到了5,继续return true,到了3,继续retrue true 

此时返回完毕,同时我们有了一个栈,这个栈里存储的是一个路径

 

接着我们找4,同样要先走3,5,6,然后继续找6的左边和右边,但是都为空,我们返回false,此时6的左右以及6本身都不是,那么我们pop掉栈里的一个元素,也就是pop掉了6,此时5的左边已经走完了,接着就是5的右边,用同样的顺序,我们入了2和7,然后7的左右都不是,7本身也不是,所以我们pop掉7,然后是2的右边,也就是4,我们找到了,然后依次返回true即可

 

此时我们有两个栈,然后我们比较他们的大小,谁大就pop谁,直到他们一样大为止,这里我们要pop下面的栈一个元素,栈里就还剩3,5,2,然后我们对比两个栈的元素,一样就返回这个节点,不一样就pop,上面的栈pop一个6,下面的pop一个2,然后栈顶元素都是5,也就是公共祖先,我们返回即可,时间复杂度为O(N)

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kubernetes(K8s)基本环境部署

此处只做学习使用&#xff0c;配置单master环境。 一、环境准备 1、ip主机规划&#xff08;准备五台新机&#xff09;>修改各个节点的主机名 注意&#xff1a;关闭防火墙与selinux 节点主机名ip身份joshua1 kubernetes-master.openlab.cn 192.168.134.151masterjoshua2k…

无涯教程-分类算法 - 朴素贝叶斯

朴素贝叶斯算法是一种基于应用贝叶斯定理的分类技术&#xff0c;其中强烈假设所有预测变量彼​​此独立。简而言之&#xff0c;假设是某个类中某个要素的存在独立于同一类中其他任何要素的存在。 在贝叶斯分类中&#xff0c;主要的兴趣是找到后验概率&#xff0c;即给定某些观…

抽象类和接口有什么区别?

在 Java 中&#xff0c;抽象类和接口是两种不同的类类型。它们都不能直接实例化&#xff0c;并且它们都是用来定义一些基本的属性和方法的&#xff0c;但它们有以下几点不同&#xff1a; 定义不同&#xff1a;定义的关键字不同&#xff0c;抽象类是 abstract&#xff0c;而接口…

Linux操作系统--包管理yum

1.概述 YUM(全称为 Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 CentOS中的 Shell 前端软件包管理器。基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。…

软考:中级软件设计师:数据库并发控制,完整性约束,数据库安全

软考&#xff1a;中级软件设计师:数据库并发控制 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的…

CrossOver 23 新功能介绍 CrossOver 23 版本更新了哪些功能

本次发布的CrossOver 23为用户带来了许多令人期待的新功能和优化&#xff0c;特别是对游戏方面的支持&#xff0c;更是让广大Mac游戏玩家兴奋。CrossOver 23包括对Wine 8.0.1的更新&#xff0c;带来了5000多处改动&#xff0c;对各种应用程序进行了改进。该版本还包括 Wine Mon…

AD9361配置采用纯PL方式,QT编写的小软件可以快速实现

采用ADI官方的API函数&#xff0c;虽然能够快速的实现AD9361配置&#xff0c;让我们不必关注9361的内部寄存器的配置过程&#xff0c;但是在实际的项目开发过程中&#xff0c;也在一定程度上限制了AD9361与PL之间数据交互的灵活性。 今天给大家推荐采用AD9361官方提供的配置软…

Linux操作系统--克隆虚拟机

1.概述 我们在搭建大数据或者是集群的过程中,需要使用到许多配置相同或者相类似的环境。这一个时候就需要使用到克隆虚拟机的功能。 2.克隆虚拟机过程 (1).从现有虚拟机(关机状态)克隆出新虚拟机,右键选择管理=>克隆,如下所示 (2).直接点击下一步。如下所示 (3).选择…

什么是浮动(float)?请解释清楚浮动对父元素和兄弟元素的影响。

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 浮动&#xff08;Float&#xff09;⭐ 浮动对父元素的影响⭐ 浮动对兄弟元素的影响⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入…

Centos8的NAT网络设置

1、先将虚拟机设置为NAT模式 2、打开虚拟网络编辑器&#xff0c;记录以下信息 NAT设置&#xff1a;子网掩码、网关 DHCP设置&#xff1a;I P 范围 (自动时) 3、进入Centos8的网络设置页面&#xff0c;按照记录的信息进行配置 4、重载、重启网卡 nmcli c reload ensl60 n…

什么是字体图标(Icon Font)?如何在网页中使用字体图标?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 字体图标&#xff08;Icon Font&#xff09;⭐ 如何在网页中使用字体图标⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&a…

Linux操作系统--常用指令(系统定时任务)

(1).概述 在实际的运维过程中,这一个功能使用的还是很多,比如,我们需要在定点的时候进行系统的备份、清理、存盘等工作。这一个时候就需要使用系统定时任务。 (2).查看crontab是否开启 (3). crontab 定时任务设置 功能:设置定时的任务 语法: crontab [选项] 选项: -e 编…

《向量数据库指南》——什么叫“AI 向量数据库”,它和我们日常理解的数据库有什么不同?

我认为"AI 向量数据库"这个概念非常切合实际,它类似于关系数据库在交易领域的作用。个人观点是,向量数据库实际上是为了人工智能而生的。一方面,向量数据库的数据完全源自于人工智能技术。另一方面,对于 AI 应用而言,向量数据库也是至关重要的基础设施。 至于…

【CSS】CSS 背景设置 ( 背景半透明设置 )

一、背景半透明设置 1、语法说明 背景半透明设置 可以 使用 rgba 颜色值设置半透明背景 ; 下面的 CSS 样式中 , 就是 设置黑色背景 , 透明度为 20% ; background: rgba(0, 0, 0, 0.2);颜色的透明度 alpha 取值范围是 0 ~ 1 之间 , 在使用时 , 可以 省略 0.x 前面的 0 , 直接…

美国慌了,满世界找稀土替代却找不到,最终还是得求中国

中国先后对稀土、镓、锗等稀有金属材料的出口采取限制措施&#xff0c;美国一开始并不慌&#xff0c;毕竟全球还有美国自己、澳大利亚、蒙古等国家拥有稀土矿藏&#xff0c;因此美国以为可以迅速找到替代&#xff0c;然而如今却发现事情并不简单。 中国占有的稀土矿藏确实不算最…

Cesium 在绘制带有箭头的线时,出现绘制不完整情况

文章目录 问题分析解决 问题 如图所示&#xff0c;在绘制带有箭头的线时&#xff0c;出现绘制不完整情况 分析 depthTestAgainstTerrain 属性的设置问题。 属性为true之后&#xff0c;相对于地形表面绘制&#xff0c;所以有地形的时候&#xff0c;会被地形的高程遮挡&#xf…

Hbase-技术文档-java.net.UnknownHostException: 不知道这样的主机。 (e64682f1b276)

问题描述&#xff1a; 在使用spring-boot操作habse的时候&#xff0c;在对habse进行操作的时候出现这个问题。。 报错信息如下&#xff1a; 第一段报错&#xff1a; 第二段报错&#xff1a; java.net.UnknownHostException: e64682f1b276 问题定位解读&#xff1a; 错误 ja…

【系统】win11怎么退回win10

根据微软官方提供的回滚方案显示&#xff0c;在升级Win11之后的10天之内&#xff0c;用户可以通过系统恢复选项将Win11还原Win10。操作方式也比较简单&#xff0c;大家可以打开系统设置&#xff0c;找到相应选项&#xff0c;选择并确认后即可轻松将Win11回退早期版本。详细操作…

计算机毕业设计 游戏账号租赁交易系统 微信小程序

本文从管理员、用户、卖家的功能要求出发&#xff0c;游戏账号租赁小程序中的功能模块主要是实现首页、个人中心、用户管理、卖家管理、游戏中心管理、租赁信息管理、交易信息管理、账号申诉管理、退款信息管理、账号绑定管理、游戏类型管理、论坛管理、系统管理。经过认真细致…

java- ConcurrentHashMap 并发

1. ConcurrentHashMap 并发 1.1. 减小锁粒度 减小锁粒度是指缩小锁定对象的范围&#xff0c;从而减小锁冲突的可能性&#xff0c;从而提高系统的并发能力。减小锁粒度是一种削弱多线程锁竞争的有效手段&#xff0c;这种技术典型的应用是 ConcurrentHashMap(高性能的 HashMap)…