news 2026/7/13 4:36:52

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/7/10 22:56:32

PCB焊锡虚焊排查与预防全攻略

在 PCB 制造和电子组装环节&#xff0c;焊锡虚焊是最隐蔽也最致命的缺陷之一。它不像桥连、拉尖那样肉眼可见&#xff0c;却能在产品使用过程中引发接触不良、信号中断甚至设备烧毁等严重故障。作为深耕 PCB 行业多年的专家&#xff0c;我见过太多因虚焊导致的售后纠纷&#xf…

作者头像 李华
网站建设 2026/7/13 12:12:39

保姆级教程!把AI大模型训练过程揉碎了讲给你听,小白也能秒懂!

站在大语言模型外部看需要准备些什么样的训练数据&#xff0c;分什么阶段&#xff0c;怎样去训练大语言模型&#xff0c;把大语言模型看成一个黑盒。 LLM都是如何训练出来的呢&#xff1f; GPT的训练分为以下3个阶段&#xff1a; 1、预训练Pretrain 2、监督微调SFT (Superv…

作者头像 李华
网站建设 2026/7/13 0:34:48

4-DE10-Nano的HDMI方块移动案例——I2C通信协议

1 I2C简介 I2C&#xff08;Inter-Integrated Circuit&#xff09;是一种由飞利浦半导体&#xff08;现为恩智浦半导体&#xff09;在1980年代初开发的同步、串行、半双工的总线型通信协议。主要用于近距离&#xff08;同一块印刷电路板&#xff08;PCB&#xff09;上的集成电路…

作者头像 李华
网站建设 2026/7/13 12:54:28

软件测试认证体系全面分析

国际主流软件测试认证 ISTQB认证体系ISTQB(国际软件测试资格认证委员会)认证是全球最权威的软件测试认证体系&#xff0c;为测试行业提供了"通用语言"和完整的测试理论框架。该认证体系采用阶梯式成长路径&#xff1a;基础级(CTFL)‌&#xff1a;面向初级测试人员&am…

作者头像 李华
网站建设 2026/7/11 16:18:37

局域网扫描工具 MyLanViewer v6.7.2 便携版

下载地址&#xff1a; 夸克网盘口令&#xff1a;/~feae39cSmG~:/ 复制口令/~feae39cSmG~:/打开夸克自动识别介绍MyLanViewer 是一款功能强大的网络IP监视器和局域网扫描工具&#xff0c;能扫描出局域网里的所有电脑信息和共享文件&#xff0c;分为快速扫描和完整扫描模式&#…

作者头像 李华