LeetCode 剑指 Offer 二叉树的最近公共祖先 | 解题思路分享

news2024/11/17 23:44:18

剑指 Offer 618 - II. 二叉树的最近公共祖先

题目描述

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]

img

示例 1:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。

示例 2:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出: 5
解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。

说明:

  • 所有节点的值都是唯一的。
  • p、q 为不同节点且均存在于给定的二叉树中。

原题链接:https://leetcode.cn/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof/

解题思路

这题官方给出的难度等级是简单,我个人认为这题在简单题里应该算是比较难的了 (可能是我比较菜🤣)

我的思路是用递归dfs的方式,找到每个节点及它下层的节点中满足条件的节点个数,在回溯的时候判断找到的节点个数是否等于2,就可以找出第一个公共父节点。

具体步骤:

  1. 先保存要寻找的节点q和p,别弄丢了,由于这两个节点是后面每层递归都要用的,所以我选择用全局变量来保存,同时定义全局变量ans用来保存答案。
  2. 定义递归的终止条件,当前节点为null的时候就需要终止了。
  3. 定义count用于存储符合条件的节点个数,由于我们在递归的时候只判断当前这一层和下层节点的个数,故count在递归中定义为0即可。
  4. 判断当前节点是否满足条件,题目中已经告诉我们每个节点的值都是不一样的了,所以我们直接用节点值判断即可,而且不需要担心重复值干扰count的情况。若满足就把count+1
  5. 递归左子树和右子树,获取他们当中满足条件的节点个数,并一起加到count当中。这样一来,count就等于当前节点和所有下层节点中满足条件的个数了。
  6. 判断当前count值,是否等于2,等于2就说明已经找到q和p两个节点了,那当前节点肯定就是公共节点了。但这里要注意,我们只需要找到最近的那个公共祖先,由于递归是往上回溯的,所以第一个count==2的节点就是最近的公共祖先。为了防止上层节点重复赋值,所以我们同时要判断ans是否为null
  7. 递归结束后,答案已经被存到ans中了,我们直接返回ans即可。
  8. 配合下面的AC代码来理解解题思路更佳噢~

Java AC代码:

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        // 把值存起来,便于后面计算
        this.q = q;
        this.p = p;
        this.ans = null;
        dfs(root);
        return ans;
    }

    TreeNode q, p, ans;

    public int dfs(TreeNode now) {
        // 终止条件
        if (now == null) return 0;
        // count 用于记录本层和本层以下的所有满足条件的节点个数
        int count = 0;
        // 判断当前节点是否满足条件
        if ( now.val == p.val || now.val == q.val ) {
            count++;
        }
        // 判断下面几层的节点满足条件的个数
        count += dfs(now.left);
        count += dfs(now.right);
        // 如果满足条件的个数为2,且ans还没有被赋值
        // 说明这是第一个公共父节点,故把它存起来
        if (count == 2 && ans == null) {
            ans = now;
        }
        return count;
    }
}

运行速度还不错😋😋

image-20221031223835837

题目分享

另外还有一道跟这题有点像的题目,也一起分享给大家:160. 相交链表 - 力扣(LeetCode)

这道相交链表其实也可以看成一个“二叉树”找最近的公共节点,只不过这个“二叉树”是尾巴节点指向头节点的,而我们正常二叉树是头节点指向子树节点的,所以这两道题其实解题思路是不同的,有兴趣的同学可以练习一下噢😋🤣。
实也可以看成一个“二叉树”找最近的公共节点,只不过这个“二叉树”是尾巴节点指向头节点的,而我们正常二叉树是头节点指向子树节点的,所以这两道题其实解题思路是不同的,有兴趣的同学可以练习一下噢😋🤣。

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

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

相关文章

基于Android的车位共享系统的设计

一、课题任务与目的 1. 课题背景 随着车辆越来越多,车位紧缺成为当前生活中最严重并且着急去解决的问题之一。本项目制作一款基于Android的车位共享系统用于缓解车位紧缺造成的压力。本次所开发的停车App是基于北京当前的交通状况为出发点的,让用…

Unity人工智能初学者指南

Unity人工智能初学者指南 使用 C# 在 Unity 游戏引擎中为游戏编写非玩家角色的实用指南 课程英文名:The Beginners Guide to Artificial Intelligence Unity 2022 此视频教程共13.5小时,中英双语字幕,画质清晰无水印,源码附件全…

Qt实现全局键盘事件监听器-Windows

Qt实现全局键盘事件监听器-Windows版🍇 文章目录Qt实现全局键盘事件监听器-Windows版🍇1、概述🍈2、实现效果🍉3、实现方式🍊4、关键代码🍋5、源代码🍌更多精彩内容👉个人内容分类汇…

分布式文件存储-FastDFS环境搭建

FastDFS简介 FastDFS是什么?我们这里可以看一下度娘的解释。FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了…

grid布局 笔记

这次给大家带来的是grid布局,之前听说过但没接触过,一起来学一下吧,提升一下css认知。 1、开启方式 给父级盒子开启grid布局 display: grid2、gap 间隙 所有盒子的行列间隙为10px gap: 10px行/列 colomn-gap: 20px;row-gap: 15px注意&#…

java计算机毕业设计ssm迎新系统pv83c(附源码、数据库)

java计算机毕业设计ssm迎新系统pv83c(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项…

[MySQL]-压力测试之性能监测指标

[MySQL]-压力测试之性能监测指标 森格 | 2022年12月 本文主要是介绍在数据库的压测过程中,要时刻的一些指标,尤其是当数据库的性能达到瓶颈时,要注意哪个指标已经打满。 一、前文回顾 在前面量两篇文章中,分别介绍了两款压测数据…

数据标注过程中会遇到哪些难题 | 景联文科技

“近年来,⼈⼯智能发展迅速,影响着我们⽣活中的方方面面。随着⼈⼯智能应⽤场景不断增加,作为⼈⼯智能的上游基础⾏业,数据标注行业也快速发展,但许多不成熟的标注团队组织由于管理水平有限,且没有系统的标…

【C++笔试强训】第五天

文章目录选择题编程题选择题 在上下文和头文件均正常情况下,以下程序的输出结果是() int x 1; do{printf("%2d\n",x) }while(x--);A 1 B 无任何输出 C 2 D 陷入死循环 x1,x是后置,先使用,在加…

Python之路200个小例子网页版,真诚奉献,从一而终!

前言 历史两个月,利用所有业余时间,与朋友一起搜集、创作Python小例子,截止目前已超过200个例子: Python之路 1 简洁之美 2 Python绘图 3 Python动画 4 Python数据分析 5 Python机器学习 6 Python-GUI 一、Python基础 1…

Acrel-EIOT免调试抄表系统

安科瑞 华楠 一、远程抄表系统应用场景-互联网用户(能源参与者) 二、远程抄表系统互联网用户的痛点 2.1 数据系统价格偏高 一套系统需要前期勘察、画图、出方案、报价,建设投入服务器、网络布线、交换机,网关、人工施工及调试&…

Vue中使用vxe-table组件分页查询,多页选择数据回显,分页记录保存选中的数据

官方示例:vxe-table v3https://vxetable.cn/v3/#/table/advanced/page 当表格中需要渲染的数据量比较大,有几万几十万条数据时,在前端分页将会非常慢,建议将当前页码和每页数量传递个后端,后端分好后给前端渲染。 后端…

电脑重装小白系统没内存怎该如何解决

很多网友想要重装系统,但是在用小白系统安装的时候提示没内存怎么办呢?我们可以卸载自己的电脑软件,或者是扩充一下自己电脑内存。不知道如何处理相关问题的小伙伴可以直接看看下面小编分享的文章小白系统没内存怎么办。 工具/原料: 系统版…

MySQL主从复制-----读写分离

MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的二进制日志功能。就是一台或多台Mysql数据库(slave从库)从另一台mysql数据库(master,主库)进行日志的复制然后再解析日志并应用到自身,最终…

nacos--基础--2.5--部署--集群--传统

nacos–基础–2.5–部署–集群–传统 前提 使用hd用户登陆 完成基础环境搭建https://blog.csdn.net/zhou920786312/article/details/1182123021、机器 IP端口备注192.168.187.1718848xx192.168.187.1728848xx192.168.187.1738848xx 2、tar.gz安装 2.1、安装 参考 nacos–基…

javaee之黑马旅游网4

下面来做旅游线路的查询功能 1.查询参数传递 在header.html 我们先找到这部分的位置 上面就加了两个id 引入这个js文件 控制搜索框 那我们现在来说一下,cid怎么来获取,换句话说cid是从什么地方传过来的? 首先header.html页面是被包含在r…

人力资源杂志人力资源杂志社人力资源编辑部2022年第20期目录

专题研究《人力资源》投稿:cnqikantg126.com 破解高端人才引聚难 林翠玲; 1-3 如何凸显集团企业人力资源管理价值 刘鹏飞; 4-5 中长期激励,激活科研人员创新力 刘灿;汪思源; 6-7 改革人才评价体系,助推“双一流”建设 杨帆; …

STM32CUBEMX_配置stm32f103c8t6的bootloader_USB升级

STM32CUBEMX_配置stm32f103c8t6的bootloader_USB升级 1、使用stm32cubemx配置好工程(版本6.3.0),生成keil工程 2、移植必须要的一些函数 3、使用dfusedemo工具软件测试 ①配时钟外设 ②配ST-Link调试接口(防止无法二次烧录程序&a…

理解Python的协程(Coroutine)

生成器(Generator) yield表达式的使用生产者和消费者模型yield from表达式协程(Coroutine) asyncio.coroutineasync/await总结参考链接 由于GIL的存在,导致Python多线程性能甚至比单线程更糟。 GIL: 全局解释器锁(英语:Global Interpreter Lo…

InvocationException: GraphViz‘s executables not found【BUG已解决】

项目场景: 在机器学习框架中遇到了一个bug:安装了GraphViz模块后,在对着sklearn的决策树文档操作输出决策树模型结果时,还是爆出了如下的错误: 报错位置为: display(Image(graph.create_png())) graph.wr…