【LeetCode75】第三十八题 二叉树的最近公共祖先

news2024/11/15 23:47:28

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

 给我们一棵二叉树,然后给我们pq两个节点,让我们找出二叉树中它们俩的最近的公共祖先。

那么什么样的节点是它们俩的最近的公共祖先呢,是有两种情况,第一种情况的pq两个节点都在同一条路径上,像下图这样:

 那这时pq的最近公共祖先就是pq之中更靠进上层的那个节点,也就是pq之中有个节点是自己的祖先节点。

另一种情况就是,他们分布在它们公共祖先的左右两侧,也就是pq里其中一个在最近公共祖先的左子树上,另一个在最近公共祖先的右子树上,像下图这样:

 因为pq已经各自分布在这个节点的左右两侧了,如果这个节点再往下走,不管是走哪个方向,都不可能再同时是它们两个节点的公共祖先了。

所以我们在递归遍历二叉树的时候,一旦发现了pq分布在某个节点的左右两侧,或是直接遍历到了pq节点,那就将当前节点返回出去即可。

我们做常规的遍历二叉树,并且再遍历里头再套一层递归遍历分别去当前节点的左子树和右子树寻找是否有pq节点。

在递归遍历之前先检测当前节点是否是pq之一,是的话直接返回当前节点。

如果pq分别分布在当前节点的左右子树,那么也直接返回当前节点。

最后一种情况就是,pq分布在当前节点的同一侧。

 

这时候虽然当前节点也还是两个节点的公共祖先,但并不是最近的公共祖先,并且因为pq都在当前节点的某棵子树上(左子树或是右子树),那么它们的最近公共祖先必然是在当前节点的子树,所以在我们需要将当前节点向那棵子树上转移,直到出现上面第一第二种情况。

代码:

class Solution {
public:
    bool find(TreeNode* root,TreeNode*p,TreeNode* q){   //寻找是否有pq
        if(root==nullptr) return false;
        if(root==p || root==q) return true;
        return find(root->left,p,q)||find(root->right,p,q);
    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==p||root==q) return root;
        TreeNode* res=root;
        bool l=find(root->left,p,q);bool r=find(root->right,p,q);
        while(l||r){    
            //如果自己本身就是其中一个节点,那么直接返回即可
            if(res==p||res==q) return res;
            if(l&&!r){  //如果pq全部集中在左子树,就往左子树移动  
                res=res->left;    
            }else if(r&&!l){    //如果pq全部集中在右子树,就往右子树移动
                res=res->right;
            }else{  //如果是左右各占一个,那么返回该节点
                return res;
            }
            //寻找pq的分布情况
            l=find(res->left,p,q);
            r=find(res->right,p,q);
        }
        return root;
    }
};

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

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

相关文章

Linux常用命令——df命令

在线Linux命令查询工具 df 显示磁盘的相关信息 补充说明 df命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。 语法 df(选项)(参数)选项 -a或--all:包含全部的…

C#,《小白学程序》第六课:队列(Queue)的应用————《实时叫号系统》

1 文本格式 /// <summary> /// 下面定义一个新的队列&#xff0c;用于演示《实时叫号系统》 /// </summary> Queue<Classmate> q2 new Queue<Classmate>(); /// <summary> /// 《小白学程序》第六课&#xff1a;队列&#xff08;Queue&#xf…

用Python画出极坐标的基向量

文章目录 极坐标基向量的推导可视化 极坐标基向量的推导 极坐标其实很神奇&#xff0c;一方面&#xff0c;它描述的是平直时空&#xff0c;另一方面&#xff0c;任意两点间的坐标差为 d r , d θ \text dr, \text d\theta dr,dθ时&#xff0c;两点间的距离却是不固定的。极坐…

wxpython + cef 是优秀的 WebView 组件

CEF 即 (Chromium Embedded Framework)&#xff1b;cef 是优秀的 WebView 组件。 pip install wxpython4.2 wxPython-4.2.0-cp37-cp37m-win_amd64.whl (18.0 MB) Successfully installed wxpython-4.2.0 pip install cefpython3 cefpython3-66.1-py2.py3-none-win_amd64.whl …

springboot+vue基于 JAVA 的医院门诊信息管理系统的设计与实现 f1ls0

系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对医院门诊信息的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”的思…

多线程和并发(1)—等待/通知模型

一、进程通信和进程同步 1.进程通信的方法 同一台计算机的进程通信称为IPC&#xff08;Inter-process communication&#xff09;&#xff0c;不同计 算机之间的进程通信被称为 RPC(Romote process communication)&#xff0c;需要通过网络&#xff0c;并遵守共同的协议。**进…

每日三题 1448统计二叉树中好节点的个数 100相同的树 101对称二叉树

1448 题目 给你一棵根为 root 的二叉树&#xff0c;请你返回二叉树中好节点的数目。 「好节点」X 定义为&#xff1a;从根到该节点 X 所经过的节点中&#xff0c;没有任何节点的值大于 X 的值。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,3,null,1,5] 输出&#xff…

2021-05-25 rs485保护电路

今天给大家分享485接口的EMC设计&#xff0c;希望对电路设计&#xff0c;及相关软件开发的人员有帮助。 一、原理图 1. RS485接口6KV防雷电路设计方案 &#xff08;RS485接口防雷电路&#xff09; 接口电路设计概述&#xff1a; RS485用于设备与计算机或其它设备之间通讯&…

攻防世界-Web_php_unserialize

原题 解题思路 注释说了flag存在f14g.php中&#xff0c;但是在wakeup函数中&#xff0c;会把传入的文件名变成index.php。看wp知道&#xff0c;如果被反序列话的字符串其中对应的对象的属性个数发生变化时&#xff0c;会导致反序列化失败而同时使得__wakeup 失效&#xff08;CV…

Qt/C++编写视频监控系统80-远程回放视频流

一、前言 远程回放NVR或者服务器上的视频文件&#xff0c;一般有三种方式&#xff0c;第一种是调用厂家的SDK&#xff0c;这个功能最全&#xff0c;但是缺点明显就是每个厂家的设备都有自己的SDK&#xff0c;只兼容自家的设备&#xff0c;如果你的软件需要接入多个厂家的&…

STM32新手入门-什么是寄存器

✅作者简介&#xff1a;嵌入式入坑者&#xff0c;与大家一起加油&#xff0c;希望文章能够帮助各位&#xff01;&#xff01;&#xff01;&#xff01; &#x1f4c3;个人主页&#xff1a;rivencode的个人主页 &#x1f525;系列专栏&#xff1a;玩转STM32 &#x1f4ac;保持学…

小程序外包开发上线的问题解决

在小程序上线过程中&#xff0c;可能会遇到各种问题。解决问题的关键是保持沟通、持续改进和测试。小程序的上线后维护同样重要&#xff0c;要不断关注用户反馈和市场变化&#xff0c;及时做出调整和优化。以下是一些常见问题及其可能的解决方案&#xff0c;希望对大家有所帮助…

FL水果21.1全新版本下载FL Studio新增功能讲解

FL Studio就是国人众所熟知的水果编曲软件&#xff0c;圈内用户习惯叫它“水果”。它是一个全能音乐制作环境和数字音频工作站&#xff08;DAW&#xff09;。FL Studio可以进行编曲、剪辑、录音、混音&#xff0c;让你的电脑变成全功能录音室&#xff0c;帮助你制作出属于自己的…

各地区结婚、离婚、再婚等数据(1990-2021年)

涵盖了1990年至2021年各地区的结婚、离婚以及再婚情况。通过对此数据进行分析&#xff0c;我们可以了解婚姻趋势的演变和地区之间的差异。数据反映了人们的婚姻决策、家庭变化以及社会动态&#xff0c;为研究家庭结构和社会变迁提供了有价值的信息。 一、数据介绍 数据名称&a…

基于树莓派的智能小车 python

摘要 playWithRaspberryPi 实战笔记 raspberrypi_cookbook 树莓派python代码本 树莓派(Raspberry Pi)是一种小型的单片机计算机&#xff1b; 它可以通过其引脚和接口与外部硬件通信。 Pi(树莓派的简称)展示了我们可以如何分解大型的Realbox机器&#xff0c; 使Dynamicland成…

如何在windows下使用masm和link对汇编文件进行编译

前言 32位系统带有debug程序&#xff0c;可以进行汇编语言和exe的调试。但真正的汇编编程是“编辑汇编程序文件(.asm)->编译生成obj文件->链接生成exe文件”。下面&#xff0c;我就来说一下如何在windows下使用masm调试&#xff0c;使用link链接。 1、下载相应软件 下载…

Linux系统编程系列之进程间通信(IPC)-管道

一、什么是管道 在Linux系统下&#xff0c;一切皆文件&#xff0c;所以管道就是一个文件&#xff0c;用来实现进程间通信的一种方式。分析小技巧&#xff1a;对于一些陌生的概念&#xff0c;都把它当成是文件&#xff0c;然后操作的时候&#xff0c;就是三部曲。文件打开&#…

香港服务器是什么?

香港服务器是指位于香港地区的云服务器或物理服务器。香港作为一个重要的国际金融和商业中心&#xff0c;具有良好的地理位置和先进的网络基础设施。香港服务器提供稳定的网络连接和高性能&#xff0c;可用于托管网站、应用程序和数据存储等各种互联网服务。 香港服务器具有以…

精准测试——持续测试

前面已经介绍了黑盒测试和白盒测试。从前面的介绍中可以知道&#xff0c;黑盒测试是一种面向业务流程的测试&#xff0c;针对需求设计测试用例&#xff0c;在运行的系统上执行测试用例&#xff0c;完成测试。 整个测试过程中测试工程师对于测试代码是如何运行的一无所知&#…

深度学习算法模型转成算能科技平台xx.bmodel模型的方法步骤

目录 1 docker镜像下载 2 SDK下载 3 下载sophon-demo 4 修改docker镜像的脚本 5 创建个文件夹 6.source 7.转模型 1 docker镜像下载 可以在dockerhub看到镜像的相关信息 https://hub.docker.com/r/sophgo/tpuc_dev/tags 用下面的命令下载 docker pull sophgo/tpuc_d…