首页 > 编程语言 >LeetCode-Python-1650. 二叉树的最近公共祖先 III

LeetCode-Python-1650. 二叉树的最近公共祖先 III

时间:2024-08-24 14:53:54浏览次数:7  
标签:q1 Node p1 parent Python 节点 二叉树 1650 c1

给定一棵二叉树中的两个节点 p 和 q,返回它们的最近公共祖先节点(LCA)。

每个节点都包含其父节点的引用(指针)。Node 的定义如下:

class Node {
    public int val;
    public Node left;
    public Node right;
    public Node parent;
}

根据维基百科中对最近公共祖先节点的定义:“两个节点 p 和 q 在二叉树 T 中的最近公共祖先节点是后代节点中既包括 p 又包括 q 的最深节点(我们允许一个节点为自身的一个后代节点)”。一个节点 x 的后代节点是节点 x 到某一叶节点间的路径中的节点 y。

示例 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,根据定义,一个节点可以是自身的最近公共祖先。

示例 3:

输入: root = [1,2], p = 1, q = 2
输出: 1

提示:

  • 树中节点个数的范围是 [2, 105]
  • -109 <= Node.val <= 109
  • 所有的 Node.val 都是互不相同的。
  • p != q
  • p 和 q 存在于树中。

第一种思路:

如果我们先不断向上遍历找到 root, 那么题目就变成了LeetCode-Python-236. 二叉树的最近公共祖先

第二种思路:

如果你把 parent 指针看成 next,那么这道题其实就是返回两个链表的第一个公共节点。

我们可以使用双指针,遍历到尾部之后跳转到另一个链表,第一个相同的节点就是答案。

举例:

p1, p2, c1, c2, (q1, c1)

      q1, c1, c2, (p1, p2, c1)

指针 i 从 p1 出发,走两步到 c1, 再走两步到 q1, 再走一步到c1遇到 j,c1 即是答案

指针 j 从 q1 出发,走一步到 c1, 再走两步到 p1, 再走两步到 c1 遇到 i

这种走法使得每个指针都走了 diff_p + diff_q + common 步, 最后会在第一个公共节点相遇。

时间复杂度:O(N)

空间复杂度:O(1)

class Solution(object):
    def lowestCommonAncestor(self, p, q):
        """
        :type node: Node
        :rtype: Node
        """
        # find root, then normal medium
        # find the convergence point of two linked list
        # both pointers will move diff_p + diff_q + common
        # p1, p2, c1, c2
        #     q1, c1, c2
        # for i, 2 steps from p1 to c1, 2 steps from c1 to q1 and 1 step from q1 to c1
        # for j, 1 step from q1 to c1, 2 steps from c1 to p1, and 2 steps from p1 to c1
        # eventually, they will meet at c1
        i, j = p, q
        while i != j:
            i = i.parent if i.parent else q
            j = j.parent if j.parent else p
        return i

标签:q1,Node,p1,parent,Python,节点,二叉树,1650,c1
From: https://blog.csdn.net/qq_32424059/article/details/141498578

相关文章

  • MAC 查看是否安装 Python
    在Mac上查看是否安装了Python以及安装的版本,你可以通过终端(Terminal)来执行一些简单的命令。以下是几种常用的方法:方法1:使用python或python3命令打开终端(Terminal)。输入python--version或python3--version(取决于你的系统配置和Python的安装方式),然后回车。如果系统返......
  • 基于python+flask框架的鞋子购物系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和电子商务的普及,线上购物已成为人们日常生活中不可或缺的一部分。鞋类作为时尚与舒适并重的消费品,其市场需求持......
  • 基于python+flask框架的假期托管服务管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着社会节奏的加快和家庭结构的变化,双职工家庭及单亲家庭对于儿童假期托管的需求日益增长。传统的家庭照看模式已难以满足现代家庭对于孩......
  • Python 教程(三):Python运算符合集
    Python中常用的一些运算符类型算术运算符+:加法-:减法*:乘法/:除法(结果为浮点数)%:取模(即除法余数)**:幂(指数)//:整除(结果为商的整数部分)示例代码: a=10b=3print("加法:",a+b)#输出13print("减法:",a-b)#输出7print("乘法:",a*b)#输出3......
  • 基于python+flask框架的同城跑腿平台(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在快节奏的现代生活中,人们对于即时服务的需求日益增长,尤其是在同城范围内,从紧急文件传递、代购商品到代取快递等,各种即时需求层出不穷。然......
  • 基于python+flask框架的奶茶连锁管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着奶茶市场的蓬勃发展,奶茶连锁品牌日益增多,市场竞争也愈发激烈。为了在竞争中脱颖而出,奶茶连锁企业不仅需要不断创新产品、提升口感,更需......
  • 快速入门:使用Python构建学生成绩管理应用
    前言诸位观众,本学期我有幸学习了Python编程课程。随着课程的结束,授课教师布置了一项任务,要求我们开发一个学生信息管理系统。基于老师的要求,我个人独立完成了这项任务。今天,我希望将这个简易的程序分享给大家,主要面向刚开始接触Python的新学者,希望它能助你们一臂之力。在这个......
  • 字符串包含了不需要的双引号,导致读取成json文件失败?Python怎么批量修改?
    大家好,我是Python进阶者。一、前言前几天在Python最强王者交流群【哎呦喂 是豆子~】问了一个Python数据处理的问题。问题如下:大佬们请教下这个问题,数据为下载的html文件,写法已经固定,解析成json文件会报错,这种字符串包含了不需要的双引号,导致读取成json文件失败?怎么批量修改?用......
  • 【python教程】打包和发布自己的项目,让别人去pip
    @目录1.环境搭建1.1换源1.2安装wheel1.3安装twine1.4注册PyPI账号2.编写setup.py2.1项目文件树2.2编写setup.py文件3.构建4.上传ERROR:Theuser'XXX'isn'tallowedtouploadtoproject''2024.1.19更新:1.环境搭建1.1换源在pip安装时使用-i参数,可以指定源。以下有许......
  • catvod、TVBox源的格式解析及合并多个源的内容(Python脚本)
    文章目录TVBox官网核心代码分析源内容的结构定义源内容的主体结构解析直播的结构解析ApiConfig其他处理代码核心类分析完整代码参考合并多个catvod、TVBox源的内容(Python脚本)可用catvod、TVBox源参考(最新接口)更新:解决Spider参数覆盖问题TVBox官网TVBox项目索引:htt......