python coding with ChatGPT 打卡第21天| 二叉树:最近公共祖先

相关推荐
python coding with ChatGPT 打卡第12天| 二叉树:理论基础
python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历
python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历
python coding with ChatGPT 打卡第15天| 二叉树:翻转二叉树、对称二叉树
python coding with ChatGPT 打卡第16天| 二叉树:完全二叉树、平衡二叉树、二叉树的所有路径、左叶子之和
python coding with ChatGPT 打卡第17天| 二叉树:找树左下角的值、路径总和
python coding with ChatGPT 打卡第18天| 二叉树:从中序与后序遍历序列构造二叉树、最大二叉树
python coding with ChatGPT 打卡第19天| 二叉树:合并二叉树
python coding with ChatGPT 打卡第20天| 二叉搜索树:搜索、验证、最小绝对差、众数

文章目录

  • 二叉树的最近公共祖先
    • Key Points
    • 相关题目
    • 视频讲解
    • 重点分析
  • 二叉搜索树的最近公共祖先
    • Key Points
    • 相关题目
    • 视频讲解
    • 重点分析

二叉树的最近公共祖先

Key Points

  • 后序遍历(左右中)就是天然的回溯过程,可以根据左右子树的返回值,来处理中节点的逻辑。
  • 判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。

相关题目

236. 二叉树的最近公共祖先

视频讲解

自底向上查找,有点难度

重点分析

方法一:递归法

  1. 递归的终止条件:
  • 遇到空的话,因为树都是空了,所以返回空。
  • 如果 root == q,或者 root == p,说明找到 q p ,则将其返回,这个返回值,后面在中节点的处理过程中会用到
  1. 单层处理逻辑:
  • 如果left 和 right都不为空,说明此时root就是最近公共节点。这个比较好理解
  • 如果left为空,right不为空,就返回right,说明目标节点是通过right返回的,反之依然。
def lowestCommonAncestor(root, p, q):if not root:return rootif root == p or root == q:return rootleft = lowestCommonAncestor(root.left, p, q)right = lowestCommonAncestor(root.right, p, q)if left and right:return rootif left:return leftif right:return rightreturn None

在这里插入图片描述

评价:
直接使用一次遍历来找到最近公共祖先会更高效。这种方法不需要存储所有父节点的路径,而是利用递归在回溯过程中直接找到LCA。

方法二:递归法
首先为每个节点找到其所有的父节点,然后比较这两个列表来找到最近的公共父节点

def find_all_father(root, p):res = []def find_father(root, p):if not root:return Falseif root == p or find_father(root.left, p) or find_father(root.right, p):res.append(root)return Truereturn Falsefind_father(root, p)return resdef lowestCommonAncestor(root, p, q):res1 = find_all_father(root, p)res2 = find_all_father(root, q)for i in res1:for j in res2:if i == j:return i

评价:
对于每个节点p和q,你的方法都会遍历整棵树来找到它们的所有父节点。这意味着树被遍历了两次。此外,对于找到的每对父节点,你使用了双层循环来比较它们,这会导致效率低下,尤其是在大树上。

方法三:迭代法
在这里插入图片描述

def lowestCommonAncestor(root, p, q):# 字典用于保存每个节点的父节点parent = {root: None}stack = [root]# 迭代遍历树,直到找到p和qwhile p not in parent or q not in parent:node = stack.pop()if node.left:parent[node.left] = nodestack.append(node.left)if node.right:parent[node.right] = nodestack.append(node.right)# 通过父节点字典构建p到根节点的路径ancestors = set()while p:ancestors.add(p)p = parent[p]# 检查q到根节点的路径中第一个出现在p路径集合中的节点while q not in ancestors:q = parent[q]return q

这个代码首先使用一个栈和一个字典来迭代遍历整棵树并记录每个节点的父节点。然后,它构建了从p到根节点的路径并保存在一个集合中。最后,它追溯q到根节点的路径,直到找到第一个也出现在p的路径集合中的节点。这个节点就是p和q的最近公共祖先。

评价:
这个方法避免了递归,但需要额外的存储空间来记录父节点信息,并且需要两次遍历:一次是构建父节点的映射,一次是构建从目标节点到根节点的路径。

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

Key Points

在二叉搜索树(BST)中找到两个指定节点的最近公共祖先(LCA)比在普通二叉树中要简单,因为你可以利用BST的性质:对于任何节点,左子树上的所有节点的值都小于该节点的值,右子树上的所有节点的值都大于该节点的值。这个性质允许我们使用迭代或递归的方式来快速定位LCA,而不需要像在普通二叉树中那样存储父节点或递归遍历整个树。

相关题目

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

视频讲解

二叉搜索树找祖先

重点分析

方法一:递归

def lowestCommonAncestor(root, p, q):if p.val > root.val and q.val > root.val:return lowestCommonAncestor(root.right, p, q)if p.val < root.val and q.val < root.val:return lowestCommonAncestor(root.left, p, q)return root

在这里插入图片描述

方法二:迭代法

def lowestCommonAncestor(root, p, q):while root:if p.val < root.val and q.val < root.val:root = root.leftelif p.val > root.val and q.val > root.val:root = root.rightelse:return root

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

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

相关文章

hope实验室预备役第4次测试题解

目录 1.Foreign Exchange 2.Takahashi Gets Lost 3.Sasha and the Beautiful Array 4.Sasha and the Drawing 5.Sasha and the Casino 6.Only one of two 7.村村通 8.传送门 1.Foreign Exchange 原题链接 Sample 1 InputcopyOutputcopy 4 5 7 0 3 2 2 4 3 5 25 Sample…

【AI绘画】Stable Diffusion简介_stable diffusion变现

手把手教你入门绘图超强的AI绘画&#xff0c;用户只需要输入一段图片的文字描述&#xff0c;即可生成精美的绘画。给大家带来了全新保姆级教程资料包 &#xff08;文末可获取&#xff09; Stable Diffusion是2022年发布的深度学习文本到图像生成模型&#xff0c;它主要用于根据…

ncnn之三(补充):window环境下vs2022安装ncnn+protobuf

启动VS2022 下面的 x64 Native Tools Command Prompt for VS2022 protobuf git clone gitgithub.com:protocolbuffers/protobuf.git# 或者 下载 https://github.com/google/protobuf/archive/v3.11.2.zip cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPERelease -D…

HTML的特殊字符

HTML的特殊字符 有些特殊的字符在 html 文件中是不能直接表示的&#xff0c;例如: 空格&#xff0c;小于号(<)&#xff0c;大于号(>)&#xff0c;按位与(&)。 空格 示例代码&#xff1a; 运行结果&#xff1a; 由于html 标签就是用 < > 表示的&#xff0…

【快速搞定Webpack5】修改输出文件目录及自动清理上次打包文件(五)

介绍 默认情况下webpack打包后&#xff0c;我们的图片和js等文件都会被打包到dist目录下&#xff0c;文件多了混淆在一起一方面不利于文件的查找和管理&#xff0c;另外一方面看上去也不美观。 所以今天我们学习的内容就是控制输出后的文件进入不同的目录。 一、配置 新增4…

BioTech - 大型蛋白质复合物的组装流程 (CombFold)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/136187314 CombFold是用于预测大型蛋白质复合物结构的组合和分层组装算法&#xff0c;利用AlphaFold2预测的亚基之间的成对相互作用。CombFold的组…

MES系统的功能有哪些?

阅读本文&#xff0c;你将了解&#xff1a;一、MES系统是什么&#xff1b;二、MES系统的功能&#xff1b;三、MES系统的使用场景与案例分析&#xff1b;四、如何更高效地利用MES系统。 这是我们公司正在使用的MES系统&#xff0c;已为大家搭建好模板了&#xff0c;无需下载&…

美团外卖商超销量数据

字段内容&#xff1a; shop_id varchar(50) NOT NULL, shop_id_str varchar(50) NOT NULL, shop_name varchar(400) DEFAULT NULL, shop_min_price varchar(10) DEFAULT NULL, shop_score varchar(10) DEFAULT NULL, shop_wm_score varchar(10) DEFAULT NU…

【Vuforia+Unity】AR02-长方体物体识别

1.创建模型 选择多维长方体图&#xff0c;这个长方体是生活中的真实物体的拍摄图&#xff0c;提前把6个面拍摄好并裁剪干净。 官网创建模型https://developer.vuforia.com/targetmanager/project/targets?projectId0ddbb5c17e7f4bf090834650bbea4995&avfalse 设置长宽高…

0220作业

C语言实现LED1闪烁 led.h #ifndef __LED_H__ #define __LED_H__//RCC寄存器封装 #define RCC_MP_AHB4_ENSETR (*(volatile unsigned int*)0x50000A28) //寄存器封装//GPIO寄存器封装 typedef struct{volatile unsigned int MODER; //00volatile unsigned int OTYPER; //04vol…

java数据结构与算法刷题-----LeetCode144. 二叉树的前序遍历

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 解题思路 利用递归&#xff0c;每次入栈一个结点&#xff08;每次递归都是…

优思学院【六西格玛案例】美国医院急诊部满意度提升

今天&#xff0c;优思学院来分享一个早期六西格玛项目的案例&#xff0c;项目背景是这样的&#xff0c;多年前&#xff0c;美国犹他州盐湖城的LDS医院已经实施了许多最佳实践。医院提供了床旁登记、高级分诊协议、护理点测试和实时放射学检查。一个强大而全面的持续质量改进计划…

CSS三大定位方式(浮动、定位、弹性盒)详细解析

CSS三大定位方式 前言&#xff1a;作为一名前端开发&#xff0c;已经工作2年了。由于自己是半路出家&#xff0c;从嵌入式方向转到前端开发&#xff0c;都是边百度边开发&#xff0c;很多基础都不了解&#xff0c;只要解决问题就好&#xff0c;但是近来为了让自己知识体系化&a…

北京高考数学填空题真题练一练(2014-2023)

距离2024年高考还有不到四个月的时间&#xff0c;今天我们来看看北京市的高考数学题真题。最近几年&#xff0c;只有北京、天津、上海三个直辖市的高考题是自主命题&#xff0c;其他省份全部是使用教育部统一命题的试卷。而且北京、天津、上海的数学现在也不再区分文理卷了&…

利用iSCSI服务部署IP SAN网络存储服务

一、配置环境&#xff08;Vmware WorkStation虚拟环境&#xff09; 服务端与客户端OS&#xff1a;openEuler 22.03-LTS CPU&#xff1a;1U1C 内存&#xff1a;2G 硬盘&#xff1a;5个SCSI磁盘&#xff0c;其中一个作为系统盘&#xff0c;另外四个配置为RAID5阵列 服务器IP…

TOUCHDESIGNER(1-2) 元件

元件来了 一级 二级 三级!!!

2024PMP备考-高质量PMP真题和很详细解析(3)

本专题&#xff0c;华研荟专门为大家讲解最近两年在中国大陆、香港、澳门地区的PMP考试真题&#xff0c;并且提供比较详细的解析&#xff0c;让大家知其然&#xff0c;还知其所以然。帮助大家最后20天有效冲刺&#xff0c;一次性3A通过2024年PMP考试。 2024年PMP考试新考纲-近年…

数据结构:跳表讲解

跳表 1.什么是跳表-skiplist1.1简介1.2设计思路 2.跳表的效率分析3.跳表实现3.1类成员设计3.2查找3.3插入3.4删除3.5完整代码 4.skiplist跟平衡搜索树和哈希表的对比 1.什么是跳表-skiplist 1.1简介 skiplist本质上也是一种查找结构&#xff0c;用于解决算法中的查找问题&…

Python开发户型图编辑器-2D/3D户型图展示

在现代家居设计中&#xff0c;户型图是不可或缺的工具&#xff0c;它为设计师和业主提供了一个直观的展示和规划空间的方式。然而&#xff0c;传统的户型图编辑软件往往复杂难用&#xff0c;限制了设计师的创作灵感。我们为您带来了一款全新的Python开发的户型图编辑器&#xf…

计算机视觉基础:【矩阵】矩阵选取子集

OpenCV的基础是处理图像&#xff0c;而图像的基础是矩阵。 因此&#xff0c;如何使用好矩阵是非常关键的。 下面我们通过一个具体的实例来展示如何通过Python和OpenCV对矩阵进行操作&#xff0c;从而更好地实现对图像的处理。 示例 示例&#xff1a;选取矩阵中指定的行和列的…