【代码随想录day21】二叉树的最近公共祖先

news2024/9/22 17:19:06

题目 

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

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

思路

这题的难点在于:

  1. 如何建立每个节点与它的两棵子子树之间的关系,用什么遍历方式?
  2. 找到答案之后,怎么返回?判断条件是什么?

解决了这两个问题,这道题也就不难了。

首先思考第一个问题,我们该用什么遍历方式?试想一下,如果用前序和中序,顺序是自顶向下的,那当我们找到p和q时,怎么返回他们的最近公共祖先节点呢?无法找到了吧!所以我们希望遍历的顺序时自底向上,先找到p和q,再去找他们的公共祖先并返回。这其实就是一种回溯的思想,我们理所当然应该想到后序遍历。为什么后序遍历能做到回溯?因为后续是左右根,也就是先不断地递归调用自身的左右子树,在这个递归过程中的状态会被内部栈存储起来,直到遇到递归出口,才执行左右根中“根”的逻辑,执行完毕从栈中弹出当前状态,返回到上一层节点的状态,不断重复这个过程向上回溯。所以利用后序遍历找到p和q很容易。

第二个问题,找到p、q之后如何处理?我们可以通过后序遍历的递归过程(自顶向下)去找到p和q所在的节点位置。接下来我们这样处理,如果遇到p和q或者root为空,则直接返回自身。然后开始回溯,如果left和right有一个不为空则返回不为空的那个,不为空的那个节点一定是p和q的最近公共祖先。因为当前已经找到p和q了,并且是自底向上回溯,而在递归过程规定了只有遇到p和q才不会返回空,所以遇到的第一个left和right都不为空的root就是我们要找的最近公共祖先。如果left和right都为空,则直接返回空。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        # 根节点为空或者遇到p、q则应该返回当前节点
        if not root or root==q or root==p:
            return root
        left = self.lowestCommonAncestor(root.left, p, q)
        right = self.lowestCommonAncestor(root.right, p, q)
        # 当遇到第一个left和right不为空的节点就是答案
        if left and right:
            return root
        # 如果有一个不为空,应该直接返回不为空的节点,因为它实际上就是我们要找的答案,最后要返回到根节点所在层
        if not left and right:
            return right
        elif not right and left:
            return left
        # 都为空返回空
        else:
            return 

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

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

相关文章

java对象的强引用,弱引用,软引用,虚引用

前言:java对象在java虚拟机中的生存状态,面试可能会有人问道,了解一下 这里大量引用 《疯狂Java讲义第4版》 书中的内容

基于SpringBoot+Vue的家政服务管理平台设计与实现(源码+LW+部署文档等)

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

h3c irf简单配置案例

配置以双线连接为例,注意配置步骤不能颠倒。 SW1配置: 1.将设备优先级调整为32(1-32),确保该设备被选举为Master(主设备) [SW1]irf member 1 priority 32 2.关闭要加入的IRF的物理端口。 [SW1…

基于Web的智慧景区GIS三维可视化运营系统

随着人民生活水平的提高和旅游产品的丰富多样,我国人民对于旅游的需求逐渐从“走过场”转变为“品质体验”。 建设背景 随着互联网、大数据、人工智能等新技术在旅游领域的应用,以数字化、网络化、智能化为特征的智慧旅游成为旅游业高质量发展新动能。…

【css】小众

纯CSS实现四种方式文本反差色效果 mix-blend-mode: difference; clip-path; background-clip: text, padding-box outline 是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用。 css 样式之 filter 滤镜属性 用法与示例 使…

OpenGL Metal Shader 编程:解决图片拉伸变形问题

前面发了一些关于 Shader 编程的文章,有读者反馈太碎片化了,希望这里能整理出来一个系列,方便系统的学习一下 Shader 编程。 由于主流的 Shader 编程网站,如 ShaderToy, gl-transitions 都是基于 GLSL 开发 Shader ,加…

基于深度学习的CCPD车牌检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于CCPD数据集的高精度车牌检测系统可用于日常生活中检测与定位车牌目标,利用深度学习算法可实现图片、视频、摄像头等方式的车牌目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型训练数据集…

单机部署NGINX

​ 1、找到合适的nginx资源包,可以去官网下载 这里用的是 nginx-1.24.0.tar.gz 2、上传下载下来的nginx软件包,并解压 tar zxvf nginx-1.24.0.tar.gz cd nginx-1.24.0/ 3、安装nginx 编译 ./configure --prefix/usr/local/nginx --with-http_ssl…

从Vue2到Vue3【六】——Vue3的改变(文末送书)

系列文章目录 内容链接从Vue2到Vue3【零】Vue3简介从Vue2到Vue3【一】Composition API(第一章)从Vue2到Vue3【二】Composition API(第二章)从Vue2到Vue3【三】Composition API(第三章)从Vue2到Vue3【四】C…

Java面向对象的学习第二部分

接着上一部分继续:上一部分学了类和对象的一些基本概念、以及对象的特性之一:封装性。 一、面向对象 this方法补充: 在前面已经学了this方法,关于怎么使用,已经很属性了,但还是需要补充一些知识点&#xf…

Java中的代理模式

Java中的代理模式 1. 静态代理JDK动态代理CGLib动态代理 1. 静态代理 接口 public interface ICeo {void meeting(String name) throws InterruptedException; }目标类 public class Ceo implements ICeo{public void meeting(String name) throws InterruptedException {Th…

玩转回文:探索双下标法解谜,揭秘验证回文串的智慧攻略

本篇博客会讲解力扣“125. 验证回文串”的解题思路,这是题目链接。 验证回文串,我们最容易想到的思路就是,使用两个下标left和right,分别表示字符串的第一个字符和最后一个字符。接着,让两个下标不断向中间移动&#x…

Mysql 5.7 连接数爆满 清理连接数

Mysql 5.7 连接数爆满 清理连接数 我在做项目的时候遇到了这个报错,然后搜了半天也没有在网上找到mysql清理连接数的方案,后面还是自己写了一个 打开MySQL命令行或客户端,并使用管理员权限登录到MySQL服务器。 我这里使用的是navicat 输入…

智能小说文本字幕生成器

分享一个免费的,智能小说文本字幕生成器 智能分句。短词。 链接:https://pan.baidu.com/s/15xGlQg01LmbHHuGFZbgaiw?pwd0gjv 提取码:0gjv

动态代理的通用方法类

Java API给出的创建动态代理类中的两种方法(一般直接使用第二种方法): 生产代理对象的工厂类: package com.atguigu.pojo;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.refle…

【LeetCode-简单】剑指 Offer 06. 从尾到头打印链表(详解)

题目 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 题目地址:剑指 Offer 06. 从尾到头打印链表 - 力扣(LeetCode) 方法1:栈 思路 题目要求我们将链表的从尾到投打印一…

Backstaff InstallBuilder Crack

Backstaff InstallBuilder Crack 新的InstallBuilder调试器使安装程序开发过程中更容易识别和更正问题。它允许您在运行时查看和交互式编辑安装程序变量,提供逐步执行以测试安装程序的特定部分是否正常工作,允许从安装过程中的意外错误中恢复等等。Insta…

火车头神码ai伪原创【php源码】

大家好,小编来为大家解答以下问题,python中常用的类,python 类的用法,现在让我们一起来看看吧! 火车头采集ai伪原创插件截图:

《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(6)-Fiddler状态面板详解

1.简介 按照从上往下,从左往右的计划,今天就轮到介绍和分享Fiddler的状态面板了。 2.状态面板概览 Fiddler的状态面板概览,如下图所示: 3.状态面板详解 Fiddler底端状态栏面板详解,如下图所示: 如果你想…

网络安全工程师证书有什么用?什么是网络安全工程师?你想知道的都在这里

随着互联网的发展和大数据时代的到来,网络已经日渐深入到我们生活、工作中的方方面面,社会信息化和信息网络化,突破了应用信息在时间和空间上的障碍,使信息的价值不断提高。但是,与此同时,网页篡改、计算机…