0

0

Python二叉树最近公共祖先怎么找_递归分治与父节点记录

P粉602998670

P粉602998670

发布时间:2026-03-11 17:06:11

|

115人浏览过

|

来源于php中文网

原创

后序遍历递归最稳健,每个节点返回none、p、q或其lca;终止条件必须为if not root or root==p or root==q;左右子树均非空则root为lca,否则返回非空者。

python二叉树最近公共祖先怎么找_递归分治与父节点记录

递归分治怎么写才不漏 case?

直接用后序遍历递归是最常用也最稳健的做法,核心在于:**每个节点只返回三种可能——Nonepq,或它们的 LCA**。不是“找路径”,而是“问子树:你见过 p 或 q 吗?”

  • 终止条件必须写全:if not root or root == p or root == q —— 缺了 root == proot == q,就无法处理“其中一个节点本身就是祖先”的情况(比如 p=5, q=4 时答案是 5
  • 左右子树结果要分清逻辑:left_lcaright_lca 都非空 → 当前 root 就是 LCA;只有一个非空 → 直接返回它(说明 p/q 全在那一侧)
  • 别用 and/or 简写混淆语义,比如 return left_lca or right_lca 是对的,但若中间加了判断逻辑,容易错判 None 和布尔值

示例关键片段:

def lowestCommonAncestor(self, root, p, q):
    if not root or root == p or root == q:
        return root
    left = self.lowestCommonAncestor(root.left, p, q)
    right = self.lowestCommonAncestor(root.right, p, q)
    if left and right:
        return root
    return left or right

为什么不用父节点记录法?

虽然从 p、q 向上回溯找第一个共同父节点听起来直观,但在纯二叉树中——没有 parent 指针,硬加会导致空间翻倍、代码变重,且面试/线上题基本不给改结构。

  • 你需要先 DFS 一遍建哈希表:parent_map[node] = parent,额外 O(n) 空间和时间
  • 再分别从 p、q 往上走,存路径,最后比对——实际是模拟了两次向上遍历,不如后序递归一次到位
  • 如果题目明确说“树带 parent 字段”或要求支持多次查询,那另说;否则属于过度设计

路径比较法适合什么场景?

当你需要**调试过程**、或题目附带要求“返回从根到 p/q 的路径”时,路径比较法反而更直白可控。

一帧秒创
一帧秒创

基于秒创AIGC引擎的AI内容生成平台,图文转视频,无需剪辑,一键成片,零门槛创作视频。

下载

立即学习Python免费学习笔记(深入)”;

  • 本质是两次 DFS + 一次数组扫描,时间仍是 O(n),但空间最坏 O(n)(链状树时路径存满)
  • 容易出错点:回溯时忘了 path.pop(),导致路径污染;或比较循环没加 break,继续往后比造成误判
  • 注意 Python 中列表切片比较要小心:path_p[:i] == path_q[:i] 不如逐个索引比更清晰,避免越界

BST 场景下千万别套通用解法

如果输入确定是二叉搜索树(BST),递归分治可以优化成 O(h) 时间、O(1) 空间迭代,而通用解法仍要 O(n) 时间。

  • BST 性质决定了:若 p.valq.val 一左一右(即 min(p.val,q.val) ),<code>root 就是 LCA
  • 否则,全小于往左走,全大于往右走——连递归都不用,一个 while 就搞定
  • 常见坑:用 == 比较 TreeNode 实例(应比值或用 is 判同一对象),或忽略 BST 值唯一性假设,加多余存在性检查

真正卡住人的,往往不是“会不会写递归”,而是没意识到:BST 的 LCA 本质上是个二分查找问题,跟树形结构关系不大。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

846

2023.08.22

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

120

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

261

2025.10.24

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

53

2025.09.03

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

22

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

48

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

93

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

216

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

412

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号