023.二叉树的最近公共祖先

news2025/8/12 2:20:37

题目链接:

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

大概思路:

题目要求:

给定一个二叉树, 找到该树中两个指定节点q,p的最近公共祖先x。(q、p一定存在且值不同)

最近公共祖先:

两个节点共同的祖先,同时深度尽可能大(其中一个可以是祖先本身)

思路:

q,p的最近公共祖先有两种情况

第一种:

思路就是从底向上遍历,遇见q、p返回其值,返回的过程中,

如果某节点最先接收左右子树的q、p,则该节点是最小节点,返回该节点直至root,

但如果没有某节点接受到q,p,那么root一定接受到p or q ,此时p or q为最小节点(这是第二种情况)(题目要求p,q必须存在,且值不一致)

第二种:

这种情况的思路,遍历的途中,p会被忽略,但返回了q上去,而此时q是最近公共祖先,所以情况被包含到第一种情况的代码里了

递归三部曲:

1.确定递归函数参数和返回类型:

参数为根节点,但因为需要返回q,p的值在递归过程中,所以加两个树指针q,p,同时返回类型为树指针

TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)

2.明确终止条件:

遍历节点遇见为空返回,同时遇见为p或为q也返回,因为需要他们的值返回来判断最近祖先是谁

if (root == q || root == p || root == NULL) return root;

3.确定递归单层逻辑:

后序遍历,方便知道左右的值后,在中再做判断。(记得递归用变量接着)

TreeNode* left = lowestCommonAncestor(root->left, p, q);

TreeNode* right = lowestCommonAncestor(root->right, p, q);

判断就是左右为不为空三种情况返回,

  • 左右不为空,为最近祖先,返回该节点上去
  • 左空右不空,返回right
  • 左不空右空,返回left
  • 左右为空,该值不是祖先,返回null上去
if (left != NULL && right != NULL) return root;

if (left == NULL && right != NULL) return right;

else if (left != NULL && right == NULL) return left;

else  { //  (left == NULL && right == NULL)
            return NULL;

4.总代码:

就是遍历寻找q、p,然后返回值的过程中交给中判断是否为最近祖先,如果没判断出来(只有一个nell和一个p或q),那么传上去的p或q为最近祖先。

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (root == q || root == p || root == NULL) return root;
        TreeNode* left = lowestCommonAncestor(root->left, p, q);
        TreeNode* right = lowestCommonAncestor(root->right, p, q);
        if (left != NULL && right != NULL) return root;

        if (left == NULL && right != NULL) return right;
        else if (left != NULL && right == NULL) return left;
        else  { //  (left == NULL && right == NULL)
            return NULL;
        }

    }
};

 

个人想法:

感觉没连起来啊,第二次写再看看。

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

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

相关文章

为什么浏览器控制台(Console)运行JavaScript代码有时会出现“undefined”?

为什么浏览器控制台(Console)运行JavaScript代码有时会出现“undefined”? 浏览器“控制台”(console)使用简介 about:blank是打开浏览器空白页的命令——内置在浏览器中的命令,可以打开浏览器空白页&…

SpringAMQP WorkQueue消息队列模型的理解与使用

原理分析 Work Queue,故名思意,工作队列,互相配合工作。适用于消息密集型消息队列的场景,如下图所示,queue中存在着大量的消息,而消费者有续配合工作,消息队列有阅后即焚的特点,所以…

【Spring Cloud实战】Spring Cloud Alibaba Sentinel熔断与限流 (最全讲解,附源码)

gitee地址:https://gitee.com/javaxiaobear/spring-cloud_study.git 在线阅读地址:https://javaxiaobear.gitee.io/ 1、简介 Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保…

【车载开发系列】CAN总线知识入门篇

【车载开发系列】CAN总线知识入门篇 【车载开发系列】CAN总线知识入门篇【车载开发系列】CAN总线知识入门篇一.总线是什么二.CAN总线是什么三.CAN总线的传输介质四.CAN协议的特性有哪些五.CAN出现的背景六.CAN通信总线的作用七.CAN协议柔软性体现在哪里八.CAN总线的仲裁机制九.…

11月24日:fastadmin根目录下其他文件

addons下的两个文件 其一:.gitkeep 其二:.htaccess application中的common文件 pubilc文件中的uploads runtime中的文件解析 vendor和composer.json的关系 根目录下.gitgnore中的相关标准 composer.json和composer.lock之间的关系 主要是承接之前的fast…

面向对象之抽象类的认识 - (java语法)

文章目录前言1. 什么是抽象类1.1 抽象类与普通类的不同:1.2 子类继承抽象类总结✨✨✨学习的道路很枯燥,希望我们能并肩走下来! 编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它…

基于JSP的民宿酒店预约管理系统【数据库设计、源码、开题报告】

数据库脚本下载地址: https://download.csdn.net/download/itrjxxs_com/86466879 主要使用技术 SpringStruts2HibernateJSPCSSJSMysql 功能介绍 后台管理: 修改密码:修改个人密码; 会员信息管理:查看会员基本信息并…

C# 学习之路(C# 编程概述)

C# 学习之路(C# 编程概述) 前记:C# 学习之路,是我跟着 C# 图解教程(第五版) 学习的笔记,每一章都会有一篇笔记发出,小标题会对应书本的章节标题。 .NET 6 和之前的版本相比在顶级语句方面有很大的变化&…

【内网渗透】记一次靶机实战

一、信息收集 1.端口扫描 使用nmap进行端口扫描,发现其开放了22、80、8080、9000端口。 访问其8080端口,发现是一个web界面。 浏览页面内容,提升有一些提示。 【一一帮助安全学习,所有资源获取处一一】 ①网络安全学习路线…

vue2升级vue3的新变化

目录1、组合式API和setup语法糖definePropsdefineEmitsdefineExpose其他2、响应式原理ref和reactiverefreactivetoReftoRefs3、computed和watchcomputedwatchwatchEffect4、v-modelv-model参数v-model修饰符5、key6、v-if和v-for的优先级对比7、异步组件vue 作者(尤…

天宇优配|医药股反弹受阻 公募乐观态度不改

历经前期继续反弹后,医药板块11月23日呈现大幅回调,相关细分赛道指数均有所下行,跌幅超越9%的相关个股更是不在少数。 国庆以来这轮医药反弹行情是否就此结束?对此,公募最新预判指出,23日医药板块回调与商场…

mp4视频格式转换器工具,万兴优转-多功能视音频处理软件

MP4是一种大众熟知的视频格式其优势在于在所有的播放器上都能够基本适用因此对于一些较为特殊的视频格式往往都需要将其转换为MP4视频格式才能够在播放器上正常播放。 那么怎样才能将这些特殊的视频格式转换为常用的mp4视频格式呢?这就需要用到mp4视频格式转换器工具…

用于useradd创建用户的规则文件-尚文网络xUP楠哥

~~全文共1026字,阅读需约5分钟。 进Q群11372462,领取专属报名福利,包含云计算学习路线图代表性实战训练大厂云计算面试题资料! # Linux创建普通用户 找来一台Linux系统,首先,执行useradd命令,不加任何参数…

力扣(LeetCode)65. 有效数字(C++)

模拟 面向测试用例的编程,想象到了工程开发的画面。改需求,代码也可以精简! 首先判断首位正负号,去除正负号,如果只有一个正负号字符,false。 判断 ′.′.′.′ ,如果是单独的 ′.′.′.′ &a…

PS软件下载安装以基本配置

先访问地址 PS下载地址 下载需要付费 给你的下载地址链接一定要保存好 然后根据自己的电脑系统和配置选择一个适合自己的 最后 会下下来一个解压包 然后 我们在 一个盘下 注意 不要用C盘 这里我选择D盘 创建一个文件夹 叫PS设计工具 然后将解压包解压到对应的 PS开发工具文…

第五章 神经网络(下)

5.3 误差逆传播算法 多层网络地学习能力比单层感知机强的多。欲训练多层网络,之前的简单感知机学习规则显然不够用了,需要更强大的学习算法。误差逆传播(error BackPropagation,简称BP)算法就是其中最杰出的代表。现实…

CPU受限直接执行

目录 1. 虚拟化CPU 2. 进程 2.1 进程的机器状态 2.2 进程创建 2.3 进程的状态 3. 受限直接执行 3.1 直接执行 3.2 受限制的操作 3.3 在进程之间切换 3.3.1 协作方式:等待系统调用 3.3.2 非协作方式:操作系统进行控制 3.3.3 保存和恢复上下…

油藏生产业务+机器学习代理优化算法

前前处理,把后台需要的参数都读出来。写进name.txt 生成新的sch文件,需要在data里追加新sch名字 没改变的井就不用重新卸载关键字里了。 重启动模型:制作出来是空的,得自己加别的东西 模型要准确,否则不好和历史模型…

【吴恩达机器学习笔记】二、单变量线性回归

✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📣专栏定位:为学习吴恩达机器学习视频的同学提供的随堂笔记。 📚专栏简介:在这个专栏,我将整理吴恩达机器学习视频的所有内容的笔记&…

OpenGL原理与实践——核心模式(三):Texture-纹理系统理论与应用

目录 初识——纹理系统是什么?怎么用? Texture —— UV坐标系统 Texture Wrapping:UV超过了[0,1]怎么办? Texture Filter:UV经过计算得到的是浮点数怎么办? 在OpenGL中该怎么做呢? Texture Unit——…