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

2023-11-08

题目链接:

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;
        }

    }
};

 

个人想法:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

023.二叉树的最近公共祖先 的相关文章

随机推荐

  • less background-image

    bg image url background image url url 2x png media webkit min device pixel ratio 3 min device pixel ratio 3 background i
  • Vue2国际化(i18n)

    一 安装 安装i18n插件 npm i vue i18n 二 配置 创建文件夹及文件 在src目录下创建lang文件夹 在lang文件夹下新建zh js和en js 分别存放中文和英文语言包 使用export default向外暴露 zh
  • Zotero学习

    看到几个很好的教程 帮助很大 做个备忘 B站 Zotero快速入门 链接 link Zotero基础操作 比Endnote更好用的文献管理软件 链接 link 知乎 Zotero SciHub 青柠学术 链接 link 搭建属于自己的文献数
  • Java API在HDFS上实现文件的上传、下载到本地、创建文件夹、删除文件和重命名文件

    前期准备 一 前期准备 1 Hadoop集群已配置完毕 2 linux系统安装jdk 3 在linux系统中安装并破解IntelliJ IDEA 二 通过JAVA API接口操纵HDFS 1 在IDEA中创建maven项目 2 设置配置文件
  • 大比拼:讯飞星火大模型将超越ChatGPT?

    5月6日 讯飞星火认知大模型成果发布会于合肥举办 会上 备受业界期待的 星火 认知大模型正式发布 讯飞AI学习机 讯飞听见 讯飞智能办公本 讯飞智慧驾舱 讯飞数字员工 四大行业中的五大成果同步演示 发布会全程进行实机展示 引发业界热烈反响
  • 查看Linux内核版本的命令

    方法一 命令 uname a 作用 查看系统内核版本号及系统名称 方法二 命令 cat proc version 作用 查看目录 proc 下version的信息 也可以得到当前系统的内核版本号及系统名称 补充说明 proc文件系统 它不是
  • wazhu架构搭建 小结

    基本的搭建步骤都在这个博客下 https www cnblogs com backlion p 10394369 html 下面写一些我再安装过程中遇到的问题 1 首先安装wazuh中的各个版本都需要一致 例如我安装的是 wazuh man
  • android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context

    问题描述 FATAL EXCEPTION main Process com wuchen juexiao mvvm PID 11732 android util AndroidRuntimeException Calling startAc
  • Linux基础服务11——LNMP架构

    文章目录 一 环境说明 二 安装nginx 三 安装mysql 四 安装php 五 配置nginx 六 配置php 七 验证 一 环境说明 主机 服务 192 168 161 129 nginx 192 168 161 131 mysql
  • Vagrant 扩大磁盘根目录(图文详解)

    Vagrant 扩大磁盘根目录 图文详解 实验环境 root centos72 cat etc redhat release CentOS Linux release 7 2 1511 Core root centos72 uname a
  • 【我的第一千篇文章】

    作为一名Java开发者 我很自豪地宣布 这里是我输出的第一千篇文章 在过去的六年里 我一直坚持每月输出优质内容 并将其分享给了全世界的读者们 这一千篇文章中 有很多关于Java编程的技巧 经验分享 优秀实践示例 案例分析等等 每篇文章都代表
  • 决策树分析例题经典案例_一级造价师考试——工程造价案例分析之2.3决策树分析法在方案评价中的应用...

    一级造价师考试 工程造价案例分析之2 3决策树分析法在方案评价中的应用 决策树分析方法一般会和资金时间价值综合起来进行考核 要会正确绘制决策树 根据资金时间价值计算各机会点的期望值 进行方案选择和决策 1 决策树的概念 决策树是以方框 和圆
  • Maven 命令

    输出依赖树 mvn dependency tree 输出依赖树到指定文件 mvn dependency tree gt tree txt 输出lib mvn dependency copy dependencies DoutputDirec
  • 如何将爬虫的数据添加到mysql数据库中

    以爬取糗事百科中24小时网页中第一列表页中所有文章的内容 作者 搞笑数 评论数为例 将爬取的四项内容存入到mysql数据库中 思路 要想存入到数据库中就需要用到数据库中的表 所以我们首先创建一个名叫 myblog 的数据库 然后在此数据库中
  • PHP 的Laravel 框架

    在windows下 搭建PHP的Laravel框架很简单 先把PHP的安装目录 加入到环境变量里 在命令行能访问到php v 就说明可以了 然后 这些是需求的环境 PHP gt 7 1 3 不用说了 OpenSSL PHP扩展 用compo
  • 51单片机编写60秒倒计时程序

    include
  • linux下mysql安装

    一 解压缩mysql 5 6 4 m7 tar zip 1 gt unzip mysql 5 6 4 m7 tar zip 会生成mysql 5 6 4 m7 tar gz的压缩文件 2 gt tar zxvf mysql 5 6 4 m7
  • mysqlbinlog命令使用

    参考 https www cnblogs com zouhong p 14540380 html https www iteye com blog wx1568934009 2469938 获取二进制日志列表show binary logs
  • Shell Script—线程

    本文主要介绍shell中的线程 线程中的等待和信号 1 线程 Shell中线程的实现有多种方式 目前只介绍通过 符号 通过在命令末尾加上 符号 可以在后台启动一个进程并立即返回 允许Shell进程继续执行其他命令 示例 bin bash N
  • 023.二叉树的最近公共祖先

    题目链接 236 二叉树的最近公共祖先 大概思路 题目要求 给定一个二叉树 找到该树中两个指定节点q p的最近公共祖先x q p一定存在且值不同 最近公共祖先 两个节点共同的祖先 同时深度尽可能大 其中一个可以是祖先本身 思路 q p的最近