剑指offer——JZ86 在二叉树中找到两个节点的最近公共祖先 解题思路与具体代码【C++】

news2024/9/29 1:28:39

一、题目描述与要求

在二叉树中找到两个节点的最近公共祖先_牛客题霸_牛客网 (nowcoder.com)

题目描述

给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。

数据范围:树上节点数满足1≤n≤10的5次方  , 节点值val满足区间 [0,n)

要求:时间复杂度O(n)

注:本题保证二叉树中每个节点的val值均不相同。

如当输入{3,5,1,6,2,0,8,#,#,7,4},5,1时,二叉树{3,5,1,6,2,0,8,#,#,7,4}如下图所示:

所以节点值为5和节点值为1的节点的最近公共祖先节点的节点值为3,所以对应的输出为3。

节点本身可以视为自己的祖先

示例

示例1:

输入:{3,5,1,6,2,0,8,#,#,7,4},5,1

返回值:3

示例2:

输入:{3,5,1,6,2,0,8,#,#,7,4},2,7

返回值:2


二、解题思路

根据题目要求,我们需要找到二叉树中两个节点的最近公共祖先,与二叉搜索树不同的是二叉树中节点的排序是没有规律的,所以如果我们按照二叉搜索树的思路去解决这道题目的话,需要改变寻找路径的方法

对于二叉树我们想要找到从根节点到一个结点的路径,可以通过深度优先算法,也就是沿着根节点一直访问到叶子结点,同时在访问每个结点的时候判断其是否是所要找的结点并记录下路径,如果不是并且已经走到当前分支的最后,则回溯到上一个结点走下一条分支,直至将整个二叉树遍历完或者找到路径。

首先定义一个标志flag,用来判断是否找到对应路径,初始化为false,为全局变量;

接着定义存储两条路径的vector,然后就是调用dfs函数去寻找第一条路径;

找到第一条路径后重置标志为false,然后接着调用dfs函数去寻找第二条路径;

接着通过for循环来找到两条路径中最后一个相同的结点,返回结果即可。

dfs函数实现,首先判断是否已经找到路径或者访问到叶子结点,是的话直接返回上一级;

否则将当前结点存入路径,判断当前结点是否就是目标结点,是的话更新标志并返回,否则递归遍历当前结点的左右子树;

如果找完了当前结点的子树没有目标结点,则弹出,回溯父结点。


三、具体代码

#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @param o1 int整型 
     * @param o2 int整型 
     * @return int整型
     */
    bool flag=false;//标志是否找到路径
    void dfs(TreeNode* root,vector<int>& path,int x){
        //如果已经找到路径或者访问到叶子结点则返回
        if(flag||root==nullptr) return;
        //将当前结点压入
        path.push_back(root->val);
        //如果找到目标结点,将标志设置为true,并返回
        if(root->val==x){
            flag=true;
            return;
        }
        //否则递归遍历结点的左右子树
        dfs(root->left,path,x);
        dfs(root->right,path,x);
        if(flag) return;//如果找到了则返回
        path.pop_back();//若当前子树没有,则回溯到父节点
    }
    int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
        //获取根结点到两个结点的路径
        vector<int> path1,path2;
        dfs(root,path1,o1);
        flag=false;//找到一条路径后flag为true,需要重置,用于查找下一条路径
        dfs(root,path2,o2);
        int res=0;
        for(int i=0;i<path1.size()&&i<path2.size();i++){
            if(path1[i]==path2[i]) res=path1[i];
            else break;
        }
        return res;
    }
};

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

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

相关文章

软件安全测试包含哪些内容?测试流程步骤有哪些?

泽众云测试通过专业的安全测试设备与经验丰富的实施人员从应用代码、服务器、数据库、通信交互等方面针对安全性风险进行全方位的检测&#xff1b;凭借专业的安全测试设备以及积累的安全测试用例为客户出具安全测试报告&#xff0c;并为客户提供科学的修复建议。 安全测试解决的…

c++视觉---中值滤波处理

中值滤波&#xff08;Median Filter&#xff09;是一种常用的非线性平滑滤波方法&#xff0c;用于去除图像中的噪声。它不像线性滤波&#xff08;如均值滤波或高斯滤波&#xff09;那样使用权重来计算平均值或加权平均值&#xff0c;而是选择滤波窗口内的像素值中的中间值作为输…

[硬件基础]-快速了解555定时器

快速了解555定时器 文章目录 快速了解555定时器1、555 定时器内部组成2、555 定时器的工作原理3、555 定时器的操作模式3.1 单稳态3.2 双稳态3.3 非稳态 555 定时器振荡器或通常所说的 555 定时器是一种非常流行的计时相关应用 IC。 它们坚固耐用且用途广泛&#xff0c;因为它们…

提高网站性能的10种方法:加速用户体验和降低服务器负担

在今天的数字时代&#xff0c;网站性能对于吸引和保留用户至关重要。一个快速加载的网站不仅提供更好的用户体验&#xff0c;还有助于降低服务器负担。以下是10种提高网站性能的方法&#xff0c;旨在加速页面加载速度和减少服务器的工作负荷。 压缩网页资源 利用压缩算法如gzi…

CVE-2023-36845:Juniper Networks Junos OS EX远程命令执行漏洞

Juniper Networks Junos OS EX远程命令执行漏洞(CVE-2023-36845) 复现 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#…

16-bit 内置基准模数转换器:MS1100

MS1100 是一款高精度 16bit 模数转换器。内部集成 2.048V 基 准源&#xff0c;差分输入范围达到 2.048V 。使用了 I 2 C 兼容接口。电源电 压范围为 2.7V 到 5.5V 。 MS1100 转换速率为 15 、 30 、 60 或 240SPS &#xff0c;集成有可编程增 益放大器&…

Zookeeper集群安装部署、Kafka集群安装部署

目录 1. Zookeeper简介 2. Zookeeper安装 2.1 首先&#xff0c;要确保已经完成了集群化环境前置准备环节的全部内容 2.2 【node1上操作】下载Zookeeper安装包&#xff0c;并解压 2.3 【node1上操作】创建软链接 2.4 【node1上操作】修改配置文件 2.5 【node1上操作】…

Python Django 详解(基础)

文章目录 1 概述1.1 安装 django1.2 创建 django 项目1.3 创建 app 2 启动 Django2.1 settings.py&#xff1a;注册 app2.2 view.py&#xff1a;URL和视图对应2.3 启动 Django2.4 访问 3 快速上手3.1 templates&#xff1a;html 模板3.2 static&#xff1a;静态文件3.3 模板语法…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— JS进阶(一)

思维导图 一、作用域 1.1 局部作用域 let和const声明的才有块作用域 1.2 全局作用域 1.3 作用域链 1.4 JS垃圾回收机制 1.5 闭包 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Comp…

Qt元对象系统 day5

Qt元对象系统 day5 内存管理 QObject以对象树的形式组织起来&#xff0c;当为一个对象创建子对象时&#xff0c;子对象回自动添加到父对象的children()列表中。父对象拥有子对象所有权&#xff0c;比如父对象可以在自己的析构函数中删除它的孩子对象。使用findChild()或findC…

怎么压缩ppt文件?

怎么压缩ppt文件&#xff1f;造成ppt文件体积太大的原因主要有两个&#xff1a;① 图片和媒体文件&#xff0c;PPT中使用高分辨率、大尺寸的图片或视频文件会增加文件大小。如果未经压缩或优化&#xff0c;这些文件可能会占用较大的存储空间&#xff1b;② 动画和特效&#xff…

【Unity3D编辑器开发】Unity3D中制作一个可以随时查看键盘对应KeyCode值面板,方便开发

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中&#xff0c;会遇到要使用监控键盘输入的KeyCode值来执…

十七、C语言内存函数

1 memcpy函数的使用和模拟实现 //memcpy函数的声明 void* memcpy(void* destination, const void* source, size_t num);memcpy函数可以给内存进行拷贝&#xff0c;由于不知道要拷贝的内存中存放的是哪一种类型的数据&#xff0c;所以memcpy函数的返回类型设置成了void*。 me…

【2023全网最全最火】Selenium WebDriver教程(建议收藏)

在本教程中&#xff0c;我将向您介绍 Selenium Webdriver&#xff0c;它是当今市场上使用最广泛的自动化测试框架。它是开源的&#xff0c;可与所有著名的编程语言&#xff08;如Java、Python、C&#xff03;、Ruby、Perl等&#xff09;一起使用&#xff0c;以实现浏览器活动的…

如何使用jest

最近在研究单元测试&#xff0c;虽说前端如果不是大且的项目不必要加&#xff0c;但至少得会&#xff0c;因此花了些时间研究&#xff0c;以下是我总结jest的使用。 jest是什么&#xff1f; Jest是 Facebook 的一套开源的 JavaScript 测试框架&#xff0c; 它自动集成了断言、…

bert入门

bert是什么 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种自然语言处理&#xff08;NLP&#xff09;中的预训练模型&#xff0c;它是基于Transformer架构的一种深度学习模型。BERT的主要目标是在大规模文本语料库上进行预训练&a…

自动求导,计算图示意图及pytorch实现

pytorch实现 x1 torch.tensor(3.0, requires_gradTrue) y1 torch.tensor(2.0, requires_gradTrue) a x1 ** 2 b 3 * a c b * y1 c.backward() print(x1.grad) print(y1.grad) print(x1.grad 6 * x1 * y1) print(y1.grad 3 * (x1 ** 2))输出为&#xff1a; tensor(36.) …

uniapp-vue3-弹出选择组件wo-pop-selector

wo-pop-selector弹出选择组件采用uniapp-vue3实现, 支持H5、微信小程序&#xff08;其他小程序未测试过&#xff0c;可自行尝试&#xff09; 可到插件市场下载尝试&#xff1a; https://ext.dcloud.net.cn/plugin?id14879 使用示例 <template><view><view c…

GBU808-ASEMI小功率开关电源GBU808

编辑&#xff1a;ll GBU808-ASEMI小功率开关电源GBU808 型号&#xff1a;GBU808 品牌&#xff1a;ASEMI 芯片个数&#xff1a;4 封装&#xff1a;GBU-4 恢复时间&#xff1a;&#xff1e;50ns 工作温度&#xff1a;-55C~150C 浪涌电流&#xff1a;200A 正向电流&#…

微信小程序报错request:fail -2:net::ERR_FAILED(生成中间证书)

微信小程序报错request:fail -2:net::ERR_FAILED-生成中间证书 前言一、检查网站ssl证书二、生成证书方法1.获取中间证书手动合并1.进入网站&#xff1a;[https://www.myssl.cn/tools/downloadchain.html](https://www.myssl.cn/tools/downloadchain.html)2.点击下一步3.手动合…