news 2026/4/19 19:43:34

二叉树的最近公共祖先-python-递归

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二叉树的最近公共祖先-python-递归

题目:

思路:

  1. 递归遍历:从根节点出发,递归遍历左、右子树,目标是找到pq
  2. 回溯 “判断”—— 确定 LCA:递归遍历完左右子树后,会得到两个结果(left:左子树找到的节点;right:右子树找到的节点),通过这两个结果判断当前节点的角色
左右子树结果含义(p/q的位置)当前节点的角色返回值
left=None + right=None既不在左子树,也不在右子树无目标,无贡献None
left=None + right≠None都在右子树(右子树已找到目标 / LCA)传递右子树的结果right
left≠None + right=None都在左子树(左子树已找到目标 / LCA)传递左子树的结果left
left≠None + right≠None分别在左、右子树(跨子树)自身就是最近公共祖先当前节点root
3.最终回溯 —— 定位最深 LCA

递归会从叶子节点向上回溯,每一层都按上述规则判断:

  • p/q都在某一子树中,结果会持续向上传递该子树的 LCA;
  • p/q分属左右子树,当前节点就是 “最深” 的公共祖先(因为再往下的子树只能找到其中一个目标)。

代码:

# 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': //只要当前根节点是p和q中的任意一个,就返回(因为不能比这个更深了,再深p和q中的一个就没了) if not root or root == p or root == q: return root //根节点不是p和q中的任意一个,那么就继续分别往左子树和右子树找p和q left = self.lowestCommonAncestor(root.left,p,q) right = self.lowestCommonAncestor(root.right,p,q) //p和q都没找到,那就没有 if not left and not right: return None //左子树没有p也没有q,就返回右子树的结果 if not left: return right //右子树没有p也没有q就返回左子树的结果 if not right: return left //左右子树都找到p和q了,那就说明p和q分别在左右两个子树上,所以此时的最近公共祖先就是root return root
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 8:24:33

汇编语言全接触-29.Win32调试API二

我们继续Win32调试API的话题。在本章中,我们将要学习如何修改被调试程序。下载 the example 理论:在前面一章中,我们学会了如何装载被调试的进程以及如何处理进程中发生的事件。为了有实际用途,我们的程序应具有修改被调试程序的能力。有好几…

作者头像 李华
网站建设 2026/4/16 8:45:15

大模型进阶之路:RAG与DeepSeek技术融合与最佳实践(建议收藏)

简介 本文分析了RAG与DeepSeek的结合效果,通过法律领域实验发现:DeepSeek在推理生成阶段表现优异,但不适合检索任务,应与专业嵌入模型(如Qwen2)分工协作。这种组合在需要强推理和高可追溯性的场景(如法律咨询)有潜力,关…

作者头像 李华
网站建设 2026/4/19 0:51:34

【Flink】Flink架构深度剖析:JobManager与TaskManager

Flink架构深度剖析:JobManager与TaskManager 前言 上一篇我们成功跑起了第一个 Flink 程序,但你有没有想过:当你点击"运行"后,代码是怎么被执行的?数据是怎么在多个节点之间流动的? 这篇文章我…

作者头像 李华
网站建设 2026/4/18 19:45:20

(21)手写Spring框架

Spring IoC容器的实现原理:工厂模式 解析XML 反射机制。 我们给自己的框架起名为:myspring(我的春天) 第一步:创建模块myspring 采用Maven方式新建Module:myspring打包方式采用jar,并且引入do…

作者头像 李华
网站建设 2026/4/19 2:14:07

MATLAB中两种常用的纹理特征提取方法:灰度共生矩阵和灰度差分统计

1. 灰度共生矩阵 灰度共生矩阵是迄今为止最经典、最常用的纹理分析方法。它通过计算图像中特定方向和距离的像素对出现的频率来描述纹理。 原理简介 GLCM是一个方阵,其大小由图像的最大灰度级决定。矩阵中的元素 P(i, j | d, θ) 表示在给定空间距离 d 和方向 θ 时…

作者头像 李华
网站建设 2026/4/18 14:03:21

2025年12月9日,OpenAI发布ChatGPT-5.2:未来已经到来,AI改变生活

2025年12月9日,OpenAI迎来了一个重磅发布——ChatGPT-5.2。作为继ChatGPT-5.0之后的又一重要版本更新,5.2不仅带来了更强的技术功能,还让人工智能在各个领域的应用变得更加深入人心。通过强大的多模态能力、超高的情感理解、无缝的跨行业适配…

作者头像 李华