news 2026/6/10 13:31:29

LeetCode(python)——236.二叉树的最近公共祖先

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode(python)——236.二叉树的最近公共祖先

题目

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

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

示例 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
  • pq均存在于给定的二叉树中。

思路

规律:p、q节点要么在分叉点(最近公共祖先就是分叉交点),要么在同一边(最近公共祖先是两者中的一个)

利用后序遍历去找左右子树,如果找到p、q则返回,如果为空(没找到p、q)返回None

用left去记录遍历左子树的结果

用right去记录遍历右子树的结果

有4种情况:
(1)left、right == null,说明都没有找到,p、q节点不在当前访问的节点的左右子树上,return None

(2)left为空,right不为空,说明p、q在右子树中,那么right就是最近公共祖先,return right(left不为空,right为空同理)

(3)left、right都不为空:说明p、q在当前访问的节点的左右子树上,当前节点就是最近公共祖先,return node

代码

# 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': return self.f(root, p ,q) # 递归函数:利用后序遍历在左右子树中找p、q def f(self, node: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': if node == None or node == p or node == q: # 如果当前节点是p、q直接返回 return node left = self.f(node.left, p, q) # 往左子树找 right = self.f(node.right, p, q) # 往右子树找 if left == None and right == None: return None # 如果都为空,说明不在当前节点下 if left and right: return node # 如果都不为空,说明分别位于当前节点的左右子树,那么当前节点就是LCA return left if left else right # 如果其中一个为空,一个不为空,说明p、q在同一边,那么不为空的left/right就是LCA
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 10:58:19

在校大学生零基础参加_CTF:从入门到参赛拿奖,保姆级指南

在校大学生零基础参加 CTF&#xff1a;从入门到参赛拿奖&#xff0c;保姆级指南 作为转行网安、靠 CTF 竞赛加分求职的过来人&#xff0c;我发现很多大学生对 CTF 既好奇又迷茫 —— 想参加但不知道从哪下手&#xff0c;怕自己零基础跟不上&#xff0c;也不懂赛事规则和组队技…

作者头像 李华
网站建设 2026/6/10 10:48:49

RDMA设计19:RoCE v2 发送及接收模块设计

本博文主要交流设计思路&#xff0c;在本博客已给出相关博文约150篇&#xff0c;希望对初学者有用。注意这里只是抛砖引玉&#xff0c;切莫认为参考这就可以完成商用IP设计。若有NVME或RDMA 产品及项目需求&#xff0c;请看B站视频后联系。 RoCE v2 发送及接收模块负责将用户指…

作者头像 李华
网站建设 2026/6/9 14:42:30

模拟研究fluent芯片水冷散热系统的设计与性能优化

fluent芯片水冷散热的模拟散热片上的冷凝水珠沿着铝制表面慢慢滑落&#xff0c;实验室的示波器曲线突然开始剧烈抖动——这个场景让工程师老张意识到&#xff0c;他那台价值百万的服务器又双叒叕过热了。如今芯片热流密度突破100W/cm早已不是新闻&#xff0c;传统风冷就像用蒲扇…

作者头像 李华
网站建设 2026/6/10 13:22:30

YashanDB数据库的容灾备份策略及实施最佳实践

YashanDB是一个开源的分布式数据库&#xff0c;设计上强调高可用性和可靠性。在实施容灾备份策略时&#xff0c;需要考虑到数据的安全性、可用性以及恢复时间等因素。以下是YashanDB数据库容灾备份策略的最佳实践&#xff1a;1. 定义备份策略- 全量备份与增量备份&#xff1a;定…

作者头像 李华
网站建设 2026/6/10 0:12:25

外贸网站建设公司选哪家

外贸网站建设公司选哪家&#xff1f;[百年网络科技]是您的不二之选在当今全球化的商业环境中&#xff0c;外贸网站已成为企业拓展国际市场的重要工具。一个专业、高效的外贸网站不仅能够展示企业的产品和服务&#xff0c;还能够吸引潜在客户&#xff0c;提高企业的知名度和竞争…

作者头像 李华
网站建设 2026/6/10 12:33:33

28、Linux网络基础与YaST工具使用指南

Linux网络基础与YaST工具使用指南 1. 网络基础记录类型 在网络基础中,有两种重要的记录类型:HINFO Record和PTR Record。 - HINFO Record :主机记录(Host Record)实际上指定了特定主机的TCP/IP地址。所有具有静态TCP/IP地址的主机都应在该数据库中有一个条目。 - P…

作者头像 李华