235. 二叉搜索树的最近公共祖先 Python

news2024/11/27 21:37:15

文章目录

  • 一、题目描述
      • 示例 1
      • 示例 2
  • 二、代码
  • 三、解题思路


一、题目描述

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

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

例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
在这里插入图片描述

示例 1

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

示例 2

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

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

二、代码

代码如下:

# 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节点的父节点,如果2者其当前父节点相同或者其中一个的父节点等同于另一个节点,则表示找到;
        # 如果当前父节点不相同,则继续找当前父节点的父节点,直到找到为止
        p_father = []
        q_father = []
        def findp(r):
            if r.val == p.val:
                p_father.append(r)
                return
            elif r.val > p.val:
                p_father.append(r)
                findp(r.left)
            else:
                p_father.append(r)
                findp(r.right)
        
        def findq(r):
            if r.val == q.val:
                q_father.append(r)
                return
            elif r.val > q.val:
                q_father.append(r)
                findq(r.left)
            else:
                q_father.append(r)
                findq(r.right)
        findp(root)
        findq(root)
        result = root
        for i in range(min(len(q_father),len(p_father))):
            if q_father[i] == p_father[i]:
                result = q_father[i]
                continue
            else:
                break
        return result        
        
        

三、解题思路

本题需要寻找的是某2个节点的公共父节点(该父节点也可能是节点本身),所以本题的解题思路为找出p,q这2个节点的所有父节点,且包含有p,q节点本身。
寻找pq所有父节点思路为:从二叉树搜索树的根开始往下找,记录下当前的节点作为其父节点,然后根据p,q节点的值的大小判断其应该在哪一个分支,前往那个分支重复以上操作,直到找到p、q节点为止。(因为题意保证p、q节点一定在数中存在且唯一,所以找到该节点的父节点路径仅有1条)
然后根据找到p、q的所有父节点的列表,开始从头寻找这2个列表的公共最大子列表,找到其公共最大子列表后,返回其最后一位节点即可。
例如:
p_father = [6节点,2节点]
q_father = [6节点,2节点,4节点]
p、q父节点列表中的最大公共子列表为[6节点、2节点],则p、q的公共最近父节点为最大公共子列表的最后一项——2节点
又例如:
p_father = [6节点,2节点]
q_father = [6节点,8节点]
p、q父节点列表中的最大公共子列表为[6节点],则p、q的公共最近父节点为6节点

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

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

相关文章

C++:string的模拟实现

目录 1.string的四大默认函数 1.1构造函数 1.2析构函数 1.3拷贝构造 1.4赋值运算符重载 2.访问string的三种方式 2.1[]访问 2.2迭代器访问 2.3范围for(本质是迭代器) 3.string相关功能的实现 3.1modify 3.2capacity 3.3access 3.4relations 3.5补充 4.补充 1.s…

基于Appium的UI自动化测试

为什么需要UI自动化测试 移动端APP是一个复杂的系统,不同功能之间耦合性很强,很难仅通过单元测试保障整体功能。UI测试是移动应用开发中重要的一环,但是执行速度较慢,有很多重复工作量,为了减少这些工作负担&#xff…

八大排序(二)--------冒泡排序

本专栏内容为:八大排序汇总 通过本专栏的深入学习,你可以了解并掌握八大排序以及相关的排序算法。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:八大排序汇总 🚚代码仓库:小小unicorn的代码仓库…

高端知识竞赛中用到的软件和硬件有哪些

现在单位搞知识竞赛,已不满足于用PPT放题,找几个简单的抢答器、计分牌弄一下了,而是对现场效果和科技感要求更高了。大屏要分主屏侧屏,显示内容要求丰富炫酷;选手和评委也要用到平板等设备;计分要大气些&am…

QT在安装后添加新组件【QT基础入门 环境搭建】

一、Qt的安装目录下找到MaintenanceTool工具 二、双击该exe文件运行该工具(界面可能不相同但功能一样) 登录账号,进入以下界面,点击下一步 选择更新组件,出现以下提示 三、此时需要手动添加储存库 1.进入下面网站,选择一个国内镜像 Qt Downloads 点击后面的HTTP可进入…

java CAS详解(深入源码剖析)

CAS是什么 CAS是compare and swap的缩写,即我们所说的比较交换。该操作的作用就是保证数据一致性、操作原子性。 cas是一种基于锁的操作,而且是乐观锁。在java中锁分为乐观锁和悲观锁。悲观锁是将资源锁住,等之前获得锁的线程释放锁之后&am…

如何才能实现批量抠图?一键批量抠图的办法

批量抠图是在处理大量图片时非常实用的技术,它可以帮助您快速准确地去除图片的背景或选择特定的对象。在编辑图片和设计时是一项必不可少的技能。 今天分享一款简单方便的抠图工具,智能识别并抠取图片中的各种物体、人物、动物等,效果不错&a…

简单聊聊G1垃圾回收算法整个流程 --- 理论篇 -- 下

简单聊聊G1垃圾回收算法整个流程 --- 理论篇 -- 下 软实时性预测转移时间预测可信度GC 暂停处理的调度并发标记中的暂停处理 分代 G1 GC 模式不同点新生代区域分代对象转移具体转移流程分代选择回收集合设置最大新生代区域数 GC的切换GC执行的时机 总结 上一篇 文章我们简单看了…

JDK新特性-Stream流

Stream流是用来操作集合或者数组中的数据的,Stream流提供了一种更加强大的,更加简单的方式来操作集合或者数组中的数据,代码更加简洁,可读性更好。下面是一个简单的例子: public class S1 {public static void main(S…

12万条中法常见词语对照ACCESS数据库

法文是全球通用的语言之一,要拥有国际视野,学懂全球通用语言是您的必然选择。走向成功之门,尽快学会法文吧。《12万条中法常见词语对照ACCESS数据库》收集了汉语常用词语的法文对照翻译。 本数据库是由 Microsoft Access 2000 创建的 MDB 数据…

算法训练 第三周

一、买卖股票的最佳时机 本题给了我们一个数组,这个数组的第i个元素表示股票第i天的价格,要求我们选择一天买入股票,并在这天之后的某一天卖出,问我们何时能获得最大利润。 1.循环嵌套 我们可以循环遍历所有买入的价格&#xff…

Al中秋节由来

文章目录 简介中秋节的庆祝活动有哪些?有没有其他与中秋节相关的传说或故事? 今天的话题是,扯犊子 简介 中秋节是中国传统的重要节日之一,通常在农历八月十五这一天庆祝。中秋节的由来有多种传说和故事。 其中最有名的传说是关于…

什么是HTTP状态码?常见的HTTP状态码有哪些?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是HTTP状态码?⭐ 1xx - 信息性状态码⭐ 2xx - 成功状态码⭐ 3xx - 重定向状态码⭐ 4xx - 客户端错误状态码⭐ 5xx - 服务器错误状态码⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前…

pcl--第五节 点云表面法线估算

估算点云表面法线 * 表面法线是几何表面的重要属性,在许多领域(例如计算机图形应用程序)中大量使用,以应用正确的光源以产生阴影和其他视觉效果。 给定一个几何表面,通常很难将表面某个点的法线方向推断为垂直于该点…

Qt(day3)

思维导图 小练习 second.h #ifndef SECOND_H #define SECOND_H#include <QWidget> #include<QLabel> #include<QLineEdit> #include<QPushButton> #include<QTimerEvent> #include<QTime> #include<QTextEdit> #include<QTextT…

北京小程序开发-微信小程序开发时间总结

一、双线程模型 渲染线程和逻辑线程 小程序的双线程指的就是渲染线程和逻辑线程&#xff0c;这两个线程分别承担UI的渲染和执行 JavaScript 代码的工作 渲染线程使用 Webview 进行 UI 的渲染呈现。Webview 是一个完整的类浏览器运行环境&#xff0c;本身具备运行 JavaScript…

Shiro 框架基本使用

文章目录 Shiro框架介绍Shiro 基本使用SimpleAccountRealmIniRealmJdbcRealmCustomRealm&#xff08;自定义Realm&#xff09; Shiro框架介绍 Apache Shiro是一个强大且易用的Java安全框架&#xff0c;它执行身份验证、授权、密码和会话管理。Shiro框架通过其三个核心组件&…

网络爬虫-----爬虫的分类及原理

目录 爬虫的分类 1.通用网络爬虫&#xff1a;搜索引擎的爬虫 2.聚焦网络爬虫&#xff1a;针对特定网页的爬虫 3.增量式网络爬虫 4.深层网络爬虫 通用爬虫与聚焦爬虫的原理 通用爬虫&#xff1a; 聚焦爬虫&#xff1a; 爬虫的分类 网络爬虫按照系统结构和实现技术&#…

白鲸开源 X SelectDB 金融大数据联合解决方案公布!从源头解决大数据开发挑战

业务挑战与痛点 随着互联网技术的发展、云计算技术的成熟、人工智能技术的兴起和数字化经济的崛起&#xff0c;数据已成为企业的核心资产。在金融行业中&#xff0c;数字化已成为了支撑各类业务场景的核心力量&#xff0c;包括个人理财、企业融资、股票交易、保险理赔、贷款服…

【Java 基础篇】Java 文件及文件夹操作详解

在Java编程中&#xff0c;文件和文件夹操作是常见的任务之一。你可能需要读取、写入、创建、删除文件或文件夹&#xff0c;以及遍历文件系统中的内容。本文将详细介绍Java中如何执行这些常见的文件和文件夹操作&#xff0c;适用于初学者和基础用户。 1. 文件操作 读取文件内容…