算法通过村第八关-树(深度优先)黄金笔记|寻找祖先

news2024/10/5 14:02:15

文章目录

  • 前言
  • 最近公共祖先问题
  • 总结


前言


提示:生活就是一场有很多规则,却没有裁判的比赛。 --约瑟夫·布罗茨基《悲伤与理智》

最近公共祖先问题

参考题目地址:236. 二叉树的最近公共祖先 - 力扣(LeetCode)

在这里插入图片描述
在这里插入图片描述

如果将搜索二叉树换成普通的二叉树该怎么做呢?该怎么做呢?

要想找到两个节点的最进公共祖先节点,我们可以从两个节点往上找,每个节点都往上走,一直走到根节点,那么根节点到这两个节点的连线肯定有相关的地方,如果是从上面往下走,那么最后一次相交的节点就是他们的最近公共公祖先节点。我们就可以找到6和7的最近公共节点画一个图看下:
在这里插入图片描述
6的祖先节点有3和5,7的是3,5,2。所以6和7的公共祖先是5。如果用代码实现,需要考虑好几种情况。根据

以上定义,若root是p和q的最近公共祖先,则只可能为以下情况之一:

  1. p和q在root的子树中,且分列root的异侧(即分别在左右子树中)
  2. p = root,且q在root的左或右子树中
  3. q = root,且p在root的左或右子树中

而具体在执行递归时,我们要判断的情况稍微复杂一些:比如我们要在上面的树中查找6和7的公共祖先,遍历的时候从树的根节点开始逐步向下,假如某个时刻访问到了节点为root,我们通过后序递归的查找其左右子树,此时的判断逻辑是:

  • 如果left和right都是null,说明在该子树root里面p和q一个都没有,直接返回null即可。例如上图中递归到的root为1的子树时;
  • 如果left和right都不为空,说明p和q分别在root的两侧,例如root为5,此时6和7就分别在其两侧,直接返回5就好
  • 当right 为空,left不为空,此时情况比较复杂,还要考虑两种情况
    • 首先:判断一下root 是不是p或者q,如果是说明p和q一个是另一个的祖先,直接返回就好
    • 其次:说明right子树里面什么都没有查到,而6和7在left子树里,此时需要递归去左子树查询即可,例如root=3时,此时需要递归的结果必然时right为空没不是left不为空。
  • 如果left为空,而right不为空,说明和上面一条相反。

分析了这么多,那么代码要怎么写:

    /**
     * 寻找最近的公共祖先
     * @param root
     * @param p
     * @param q
     * @return
     */
    public static TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null || root == p || root == q) {
            return root;
        }
        // 左右
        TreeNode left = lowestCommonAncestor(root.left,p,q);
        TreeNode right = lowestCommonAncestor(root.right,p,q);
        // 有点类似剪枝
        if (left == null){
            return right;
        }
        if (right == null){
            return left;
        }
        return root;
    }	

总结

提示:祖先问题

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

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

相关文章

金属铬 铬含量的测定 硫酸亚铁铵滴定法

声明 本文是学习GB-T 4702.1-2016 金属铬 铬含量的测定 硫酸亚铁铵滴定法. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 GB/T4702 的本部分规定了硫酸亚铁铵滴定法测定金属铬中铬含量。 本部分适用于金属铬(钒≤0.20%)中铬含量的测定&…

【小沐学Python】网络爬虫之urllib

文章目录 1、简介2、功能介绍2.1 urllib库和requests库2.2 urllib库的模块2.2.1 urllib.request2.2.2 urllib.error2.2.3 urllib.parse2.2.4 urllib.robotparser 2.3 入门示例 3、代码示例3.1 urlib 获取网页(1)3.2 urlib 获取网页(2) with header3.3 urllib post请求 4、urlli…

LeetCode【1. 两数之和】

穷通有命无须卜,富贵何时乃济贫;角逐名场今已久,依然一幅旧儒巾。 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输…

测试网页调用本地可执行程序(续:带参数调用)

前篇文章介绍了网页调用本地可执行程序的方式,通过在注册表中注册命令,然后在网页中调用命令启动本地程序。如果需要传递参数,则需要在注册表命令中的command项中设置如下形式的值。 "XXXXXX\XXXXXXX.exe" "%1"&emsp…

【数据分享】海洋热含量Global Ocean Heat Content CDR】

【数据分享】海洋热含量Global Ocean Heat Content CDR 海洋与大气科学 海洋热含量数据可以不用计算了,直接下载使用! 海洋热含量气候数据记录(CDR)是一组 1955 年至今的海洋热含量异常(OHCA)时间序列&…

在 android 上使用 adb client

adb tool 分为 adb 和 adbd。 adb 用作 host 使用,包含了client和server,adbd 则作为 device 端,在 android 源码目录下,共用一套源码。但 android 源码下的 adb,不支持把 adb 编译为 android 平台的 adb client。因此…

气传导耳机哪个品牌比较好?推荐几款很不错的气传导耳机

​气传导耳机是一种新型耳机类型,采用不入耳设计,上耳佩戴更加舒适稳固,还可以为你带来更加自然和舒适的听觉体验,同时满足你对周围环境的需求。面对市面上这么多气传导耳机,不知道该如何挑选时,也不用过于…

web二级操作题

js和css的引入 在 HTML 中&#xff0c;你可以使用 <script> 和 <link> 标签来引入外部的 JavaScript 文件和 CSS 文件。 引入外部的 JavaScript 文件&#xff1a; <script src"path/to/script.js"></script>src 属性指定了 JavaScript 文…

【已解决】ubuntu 16.04安装最新版本google chrome出错, 旧版本chrome浏览器安装流程

ubuntu 16.04 按照常规的Chrome 安装流程总是出错如下&#xff1a; Selecting previously unselected package google-chrome-stable. (Reading database ... 231747 files and directories currently installed.) Preparing to unpack google-chrome-stable_current_amd64.de…

阈值化分割,对灰度级图像进行二值化处理(数字图像处理大题复习 P8)

文章目录 画出表格求出灰度直方图 & 山谷画出结果图 画出表格 有几个0就写几&#xff0c;有几个1就写几&#xff0c;如图 求出灰度直方图 & 山谷 跟前面求灰度直方图的方法一样&#xff0c;找出谷底&#xff0c;发现结果为 4 画出结果图 最终的结果就是&#xf…

【Seata】seata的部署和集成

一、部署Seata的tc-server 1.下载 首先我们要下载seata-server包&#xff0c;地址在http://seata.io/zh-cn/blog/download.html 当然&#xff0c;课前资料也准备好了&#xff1a; 2.解压 在非中文目录解压缩这个zip包&#xff0c;其目录结构如下&#xff1a; 3.修改配置 修…

解决ubuntu系统python2.7安装uwsgi报错

背景 因为项目老旧&#xff0c;仍需使用python2.7&#xff0c;仍需要使用pip2 安装依赖。在安装uwsgi的时候&#xff0c;报错。 错误一 Building wheel for uwsgi (setup.py) ... error ERROR: Command errored out with exit status 1: command: /usr/bin/python2 -u -…

IBMMQ 安装教程(IBM WebSphere MQ 安装教程)- 及 IBMMQ 服务器搭建教程

文章目录 前言一、下载二、安装1. 解压&#xff0c;运行 Setup.exe 文件。2. 启动 IBM WebSphere MQ 安装程序。3. 接受用户协议。4. 选择定制安装。5. 更改安装目录。6. 下一步。7. 下一步。8. 下一步。9. 点击安装。10. 等待安装&#xff0c;完成。11. 准备安装 WebSphere MQ…

Day_15 > 内存相关的函数

目录 1.memcpy 1.1memcpy函数的使用 1.2memcpy函数的模拟实现 2.memmove 2.1memcpy存在的局限性 2.2memmove函数的使用 2.3memmove函数的模拟实现 3.memset 3.1memset函数的使用 4.memcmp 4.1memcpy函数的使用 之前我们可能了解过字符串函数&#xff0c;今天我们了解…

如何使用固态硬盘+硬盘盒子+U盘创造移动双系统

本文背景 这学期上了一节鸟水课《大数据实践》&#xff0c;老师要求扩展硬盘盒&#xff0c;以部署大数据工具进行 机器挖掘等大数据领域工作 参考视频链接&#xff1a;无需启动盘&#xff0c;用虚拟机将ubuntu安装到移动硬盘上_哔哩哔哩_bilibili 项目使用设备 1.绿联&#…

C/C++运算符超详细讲解(系统性学习day5)

目录 前言 一、运算符的概念与分类 二、算术运算符 三、关系运算符 四、逻辑运算符 五、赋值运算符 六、运算符的优先级 总结 前言 本篇文章是对运算符的具体讲解。 一、运算符的概念与分类 概念&#xff1a; 运算符就是一种告诉编译器执行特定的数学或逻辑操作的符…

Ubuntu出现无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?

1、在Ubuntu系统安装sublime是出现以下这个问题&#xff1a; 解决方法&#xff1a; 使用以下命令强制解锁&#xff1a;&#xff08;删除“/var/lib/dpkg”目录下的 “lock-frontend” 和“lock”两个文件&#xff09; sudo rm /var/lib/dpkg/lock-frontend sudo rm /var/lib/…

代码随想录算法训练营第56天|583. 两个字符串的删除操作,72. 编辑距离 (昨天的疑虑今天豁然开朗了)

链接: 583. 两个字符串的删除操作 链接: 72. 编辑距离 583. 两个字符串的删除操作 class Solution {public int minDistance(String word1, String word2) {int len1 word1.length(), len2 word2.length();int[][] dp new int[len1 1][len2 1];for (int i 0; i < le…

Android开发笔记 :理解Fragment

Android开发笔记&#xff1a;理解Fragment 导言 本篇文章产生的原因很简单&#xff0c;就是我在了解Android Jetpack中的Lifecycle框架时发现Lifecycle具体时间和状态的更新都是由一个名为ReportFragment的Fragment来跟踪的&#xff0c;为了更好的了解Fragment是如何追踪Activ…

【软件测试】测试中的风险有哪些?

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程&#xff0c;刷完面试就稳了&#xff0c;你也可以当高薪软件测试工程师&#xff08;自动化测试&#xff09; ​那么到底都有哪些风险要注意呢?如何解决呢?另外这些风险如何在计划中写明呢&#xff0c;不会写“张三…