news 2026/6/7 8:01:25

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/8 1:33:44

EmotiVoice语音合成中的语调曲线编辑功能探索

EmotiVoice语音合成中的语调曲线编辑功能探索 在虚拟助手越来越“会聊天”、游戏角色愈发“有情绪”的今天&#xff0c;人们早已不再满足于机械朗读式的语音输出。一句“你真的要这么做吗&#xff1f;”如果用平直的语调念出&#xff0c;可能听不出任何波澜&#xff1b;但若句尾…

作者头像 李华
网站建设 2026/6/7 12:04:00

无铅焊锡vs有铅焊锡:PCB焊接工艺选择

随着环保法规的日益严格&#xff0c;无铅焊锡在 PCB 焊接中的应用越来越广泛&#xff0c;但有铅焊锡凭借其优异的焊接性能&#xff0c;在部分高可靠性领域仍占据一席之地。作为 PCB 行业专家&#xff0c;我经常被问到 “无铅焊锡和有铅焊锡该怎么选”“无铅焊接的痛点怎么解决”…

作者头像 李华
网站建设 2026/6/6 13:56:28

Java Map 详解:原理、实现与使用场景

Java Map 详解&#xff1a;原理、实现与使用场景 一、介绍 Map 是 Java 集合框架&#xff08;java.util&#xff09;中键值对&#xff08;Key-Value&#xff09; 形式的集合接口&#xff0c;与 List/Set 并列&#xff08;继承自 Collection 的父接口 Iterable&#xff0c;但不…

作者头像 李华
网站建设 2026/6/7 11:26:11

YashanDB数据库的实时数据处理能力分析

YashanDB 是一个相对较新的数据库解决方案&#xff0c;具备高性能和实时数据处理能力。以下是关于 YashanDB 数据库实时数据处理能力的分析&#xff1a;1. 设计架构YashanDB 采用了分布式架构&#xff0c;支持横向扩展。这种架构能够处理大规模数据的并发访问和高吞吐量&#x…

作者头像 李华
网站建设 2026/6/6 19:50:47

当你的论文卡在第三章:宏智树AI悄悄替你铺好了整条学术红毯

凌晨两点&#xff0c;咖啡见底&#xff0c;文档光标还在闪烁。 你不是不会写&#xff0c;是被开题折磨、被文献淹没、被数据整懵、被查重吓退。 大三、大四、研一、博一……甚至在职进修的你&#xff0c;可能正在经历这样一场“学术马拉松”——明明拼尽全力&#xff0c;却总差…

作者头像 李华
网站建设 2026/6/6 21:13:24

开发自测的常见误区:软件测试从业者视角的分析与建议

在软件开发过程中&#xff0c;开发自测是确保代码质量的第一道防线&#xff0c;它不仅能及早发现缺陷&#xff0c;还能降低后期测试成本和项目风险。然而&#xff0c;许多开发人员在进行自测时&#xff0c;常因经验不足、认知偏差或时间压力而陷入误区&#xff0c;导致潜在问题…

作者头像 李华