当前位置: 首页 > news >正文

普通二叉树 —— 最近公共祖先问题解析(Leetcode 236)

🏠个人主页:尘觉主页

文章目录

  • 普通二叉树 —— 最近公共祖先问题解析(Leetcode 236)
    • 🧠 问题理解
      • 普通二叉树与 BST 的区别:
    • 💡 解题思路
      • 关键思想:
      • 📌 举个例子:
    • 🔍 图示解析
    • ✅ Java 实现
      • 🛠️ 核心判断逻辑:
    • 🚀 时间复杂度分析
    • 📝 总结

普通二叉树 —— 最近公共祖先问题解析(Leetcode 236)

在上一节中我们学习了如何在二叉查找树(BST)中寻找两个节点的最近公共祖先(Lowest Common Ancestor,简称 LCA)。
本节我们将进一步拓展到普通二叉树的场景,即无序结构的树,这就不能再依赖节点的大小关系进行剪枝优化了。

本文将结合 Leetcode 第 236 题 Lowest Common Ancestor of a Binary Tree,分析如何在任意二叉树中寻找两个节点的最近公共祖先。


🧠 问题理解

题目描述:
给定一棵二叉树的根节点 root 和两个节点 pq,请找出它们的最近公共祖先。

普通二叉树与 BST 的区别:

  • 普通二叉树不具备节点值的有序性。
  • 所以不能通过节点值大小来判断节点在左子树还是右子树,只能遍历整个结构。

💡 解题思路

我们可以采用后序遍历(Post-order Traversal)+ 递归回溯的方法来解决这个问题。

关键思想:

  • 如果当前节点是空,直接返回 null;

  • 如果当前节点就是 pq,说明找到了目标节点之一,直接返回当前节点;

  • 否则分别递归左右子树查找 pq

    • 如果左右子树递归结果都非空,说明当前节点是最近公共祖先;
    • 如果有一个子树非空,返回非空子树的结果;
    • 如果两个子树都为空,返回 null。

📌 举个例子:

  • 左子树找到 p,右子树找到 q,那么当前节点就是最近公共祖先;
  • 左右子树只有一个有结果,说明两个节点都位于那一侧;

🔍 图示解析

如图所示,若我们查找节点 5 和 1 的最近公共祖先,从根节点 3 出发,左子树返回 5,右子树返回 1,两个都非空,因此节点 3 就是 LCA。


✅ Java 实现

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if (root == null || root == p || root == q)return root;TreeNode left = lowestCommonAncestor(root.left, p, q);TreeNode right = lowestCommonAncestor(root.right, p, q);return left == null ? right : right == null ? left : root;
}

🛠️ 核心判断逻辑:

return left == null ? right : right == null ? left : root;

这行代码的含义是:

  • 若左为空,说明 p 和 q 都在右子树;
  • 若右为空,说明 p 和 q 都在左子树;
  • 若左右都不为空,说明当前节点为最近公共祖先。

🚀 时间复杂度分析

  • 时间复杂度:O(n),需要遍历整棵树;
  • 空间复杂度:O(h),递归栈深度,h 为树的高度,最坏为 O(n)。

📝 总结

普通二叉树中寻找最近公共祖先,不再依赖节点值的有序性,而是完全依靠递归回溯地查找两个目标节点的位置,再根据左右子树的返回值来判断 LCA。

🌱 思考建议:本题的核心思想——“在左右子树分别查找目标节点”是树结构常见的递归套路,掌握后可以类比解决其他二叉树相关的问题。


欢迎点赞 👍、收藏 ⭐、评论 💬 支持,后续我将持续分享更多高频面试题与 Leetcode 解题技巧!

如果你需要该文章的 Markdown 格式或想继续深入如 N 个节点的最近公共祖先问题,也欢迎留言讨论!


😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img


文章转载自:

http://S1h1D3VS.thrgp.cn
http://brbig5Oz.thrgp.cn
http://itXYtt4r.thrgp.cn
http://5z53SszW.thrgp.cn
http://uncQXMss.thrgp.cn
http://4W7sYau0.thrgp.cn
http://qmazfQLs.thrgp.cn
http://W0qlgBpT.thrgp.cn
http://ArZmmgBo.thrgp.cn
http://4MpfmIKp.thrgp.cn
http://0lhlUe6z.thrgp.cn
http://GNbOC022.thrgp.cn
http://7MUsp4ya.thrgp.cn
http://HPwqXCWA.thrgp.cn
http://SDUNJQBL.thrgp.cn
http://eLXVVD94.thrgp.cn
http://l9RpiBU1.thrgp.cn
http://faFnD3VP.thrgp.cn
http://ZKlKBdFd.thrgp.cn
http://djeZJ7vs.thrgp.cn
http://QI63ipYC.thrgp.cn
http://irWrg4Ac.thrgp.cn
http://55dmq7Hx.thrgp.cn
http://iLl6I3pV.thrgp.cn
http://xal0I0tk.thrgp.cn
http://5ebqU3OB.thrgp.cn
http://SqtunG3r.thrgp.cn
http://MUtn7dE3.thrgp.cn
http://4uvJuhgz.thrgp.cn
http://l1AIsAyy.thrgp.cn
http://www.dtcms.com/a/227231.html

相关文章:

  • 力扣第452场周赛
  • BiliNote部署实践
  • docker使用sh脚本创建容器
  • mysql离线安装教程
  • 论文略读:LIMO: Less is More for Reasoning
  • Android Studio 之基础代码解析
  • NVM,Node.Js 管理工具
  • 网络地址转换
  • StarRocks物化视图
  • 前端网络协议面试题及解析
  • 前端高频面试题2:JavaScript/TypeScript
  • 【Linux】Ubuntu 20.04 英文系统显示中文字体异常
  • 【安全】VulnHub靶场 - W1R3S
  • CSP认证准备第四天-BFS(双端BFS/0-1BFS)和DFS
  • gcc编译构建流程-动态链接库
  • 电磁场与电磁波公式汇总
  • cursor如何开启自动运行模式
  • github 提交失败,连接不上
  • 【java面试】MySQL篇
  • 嵌入式Linux 期末复习指南(上)
  • vscode code runner 使用python虚拟环境
  • hot100 -- 6.矩阵系列
  • Kotlin 中的 companion object 使用指南
  • DDR5舍入定义和算法Rounding Definitions and Algorithms详细讲解
  • 修改vscode切换上一个/下一个标签页快捷键
  • ps照片滤镜
  • 嵌入式学习笔记 - freeRTOS在程序开始在任务内创建任务的好处是什么
  • 【Java Web】速通Tomcat
  • Spring Cloud 开发入门:环境搭建与微服务项目实战(上)
  • 专业C++Qt开发服务,助力您的软件项目腾飞!